¿Por qué rotar una image con CGContextDrawImage es más lenta que dibujar un UIImage rotado?

Recibo imágenes de la camera y debo explicar que están en diferentes orientaciones. El primer enfoque que tomé fue usar este fragment de código para crear un UIImage correctamente rotado. Eso calcula un CGAffineTransform y luego dibuja la image usando CGContextDrawImage .

Sin embargo, esta operación demoró 2-3 segundos en completarse.

El segundo enfoque que tomé fue calcular por cuántos grados tendría que rotar la image, y si debo voltearlo y luego aplicar esas rotaciones antes de dibujar el UIImage . Este enfoque tomó una cantidad insignificante de time.

Para ser específico, estoy usando Cocos2D, así que en cualquier caso convertí el UIImage a un CCTexture2D , creó un sprite con esa textura y luego lo dibujé. En el primer caso, creé un nuevo UIImage y tenía un CCSprite no CCSprite . En el segundo, utilicé el mismo UIImage pero tenía un sprite girado.

¿Por qué es el segundo enfoque mucho más rápido? El resultado neto es el mismo: una image girada. Parece de alguna manera que los mismos bits y bytes deben manipularse de la misma manera para get este resultado.

Echa un vistazo a esta pregunta, experimentación y respuesta . UIImage puede estar haciendo algunas de estas optimizaciones ya en segundo plano (ya que no sabemos los detalles de implementación, no hay una manera real de saberlo).