CGContextDrawImage es EXTREMADAMENTE lento después de un gran UIImage dibujado en él

Parece que CGContextDrawImage (CGContextRef, CGRect, CGImageRef) realiza MUCHO PEOR al dibujar una CGImage creada por CoreGraphics (es decir, con CGBitmapContextCreateImage) que cuando dibuja la CGImage que respalda un UIImage. Vea este método de prueba:

-(void)showStrangePerformanceOfCGContextDrawImage
{
    ///Setup : Load an image and start a context:
    UIImage *theImage = [UIImage imageNamed:@"reallyBigImage.png"];
    UIGraphicsBeginImageContext(theImage.size);
    CGContextRef ctxt = UIGraphicsGetCurrentContext();    
    CGRect imgRec = CGRectMake(0, 0, theImage.size.width, theImage.size.height);


    ///Why is this SO MUCH faster...
    NSDate * startingTimeForUIImageDrawing = [NSDate date];
    CGContextDrawImage(ctxt, imgRec, theImage.CGImage);  //Draw existing image into context Using the UIImage backing    
    NSLog(@"Time was %f", [[NSDate date] timeIntervalSinceDate:startingTimeForUIImageDrawing]);

    /// Create a new image from the context to use this time in CGContextDrawImage:
    CGImageRef theImageConverted = CGBitmapContextCreateImage(ctxt);

    ///This is WAY slower but why??  Using a pure CGImageRef (ass opposed to one behind a UIImage) seems like it should be faster but AT LEAST it should be the same speed!?
    NSDate * startingTimeForNakedGImageDrawing = [NSDate date];
    CGContextDrawImage(ctxt, imgRec, theImageConverted);
    NSLog(@"Time was %f", [[NSDate date] timeIntervalSinceDate:startingTimeForNakedGImageDrawing]);


}

Así que supongo que la pregunta es, # 1, qué puede estar causando esto y # 2, ¿hay alguna forma de evitarlo, es decir, otras formas de crear un CGImageRef que puede ser más rápido? Me doy cuenta de que podría convertir todo a UIImages primero, pero esa es una solución tan fea. Ya tengo el CGContextRef sentado allí.

ACTUALIZACIÓN: ¿Esto no parece ser necesariamente cierto al dibujar imágenes pequeñas? Eso puede ser una pista: que este problema se amplifica cuando se usan imágenes grandes (es decir, fotos de cámara de tamaño completo). 640x480 parece ser bastante similar en términos de tiempo de ejecución con cualquiera de los métodos

UPDATE 2: Ok, he descubierto algo nuevo ... En realidad NO es el respaldo de CGImage lo que está cambiando el rendimiento. Puedo cambiar el orden de los 2 pasos y hacer que el método UIImage se comporte lentamente, mientras que la imagen CG "desnuda" será súper rápida. Parece que todo lo que realices en segundo lugar sufrirá un rendimiento terrible. Este parece ser el caso A MENOS QUE libere memoria llamando a CGImageRelease en la imagen que creé con CGBitmapContextCreateImage. Entonces, el método respaldado por UIImage será rápido posteriormente. Lo inverso no es cierto. ¿Lo que da? La memoria "abarrotada" no debería afectar el rendimiento como este, ¿verdad?

UPDATE 3: habló demasiado pronto. La actualización anterior es válida para imágenes con un tamaño de 2048x2048, pero al aumentar a 1936x2592 (tamaño de la cámara), el método CGImage desnudo sigue siendo mucho más lento, independientemente del orden de las operaciones o la situación de la memoria. Quizás hay algunos límites internos de CG que hacen que una imagen de 16 MB sea eficiente, mientras que la imagen de 21 MB no se puede manejar de manera eficiente. Es literalmente 20 veces más lento dibujar el tamaño de la cámara que una 2048x2048. De alguna manera, UIImage proporciona sus datos CGImage mucho más rápido que un objeto CGImage puro. o.O

UPDATE 4: pensé que esto podría tener que ver con algo de almacenamiento en caché de memoria, pero los resultados son los mismos si el UIImage se carga con el [UIImage imageWithContentsOfFile] como si se usara [UIImage imageNamed

UPDATE 5 (Día 2): después de crear más preguntas de las que respondí ayer, tengoalguna cos sólido hoy. Lo que puedo decir con seguridad es lo siguiente:

Las CGImages detrás de un UIImage no usan alfa. (kCGImageAlphaNoneSkipLast). Pensé que tal vez eran más rápidos de dibujar porque mi contexto estaba usando alfa. Así que cambié el contexto para usar kCGImageAlphaNoneSkipLast. Esto hace que el dibujo sea MUCHO más rápido, A MENOS QUE: Dibujar en un CGContextRef con un UIImage PRIMERO, hace que TODOS los dibujos de imágenes posteriores sean lentos

Lo probé 1) creando primero un contexto no alfa (1936x2592). 2) Lo llené con cuadrados de 2x2 de colores aleatorios. 3) El cuadro completo dibujando una CGImage en ese contexto fue RÁPIDO (.17 segundos) 4) Experimento repetido pero lleno de contexto con una CGImage dibujada que respalda un UIImage. El dibujo posterior de la imagen de fotograma completo fue de más de 6 segundos. SLOWWWWW.

e alguna manera, dibujar en un contexto con un UIImage (grande) ralentiza drásticamente todo el dibujo posterior en ese contexto.

Respuestas a la pregunta(2)

Su respuesta a la pregunta