CGContextDrawImage fica EXTREMAMENTE lento depois que UIImage grande é arrastada para ele

Parece que CGContextDrawImage (CGContextRef, CGRect, CGImageRef) executa MUITO MAIOR ao desenhar uma CGImage criada por CoreGraphics (ou seja, com CGBitmapContextCreateImage) do que quando desenha a CGImage que apóia uma UIImage. Veja este método de teste:

-(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]);


}

Então eu acho que a pergunta é: # 1 o que pode estar causando isso e # 2 existe uma maneira de contornar isso, ou seja, outras maneiras de criar um CGImageRef que pode ser mais rápido? Sei que poderia converter tudo para o UIImages primeiro, mas essa é uma solução tão feia. Eu já tenho o CGContextRef sentado lá.

UPDATE: Isso parece não ser necessariamente verdade ao desenhar imagens pequenas? Isso pode ser uma pista de que esse problema é amplificado quando são usadas imagens grandes (ou seja, fotos de câmera em tamanho real). 640x480 parece ser bastante semelhante em termos de tempo de execução com qualquer método

UPDATE 2: Ok, então eu descobri algo novo. Na verdade, NÃO é o apoio da CGImage que está alterando o desempenho. Posso fazer um flip-flop na ordem dos 2 passos e fazer com que o método UIImage se comporte lentamente, enquanto o CGImage "nu" será super rápido. Parece que o que você executar segundo sofrerá um desempenho terrível. Este parece ser o caso, a menos que eu libere memória chamando CGImageRelease na imagem que criei com CGBitmapContextCreateImage. Em seguida, o método suportado UIImage será rápido posteriormente. O inverso não é verdade. O que da? A memória "lotada" não deve afetar um desempenho como esse, deveria?

UPDATE 3: falou muito cedo. A atualização anterior é válida para imagens no tamanho 2048x2048, mas, com o aumento de 1936x2592 (tamanho da câmera), o método CGImage despido ainda é muito mais lento, independentemente da ordem das operações ou da situação da memória. Talvez haja alguns limites internos de CG que tornem uma imagem de 16 MB eficiente, enquanto a imagem de 21 MB não pode ser manipulada com eficiência. É literalmente 20 vezes mais lento para desenhar o tamanho da câmera do que um 2048x2048. De alguma forma, o UIImage fornece seus dados CGImage muito mais rapidamente do que um objeto CGImage puro. o.O

UPDATE 4: Eu pensei que isso poderia ter a ver com alguma coisa de cache de memória, mas os resultados são os mesmos, se o UIImage é carregado com o não cache [UIImage imageWithContentsOfFile] como se [UIImage imageNamed] fosse usad

UPDATE 5 (Dia 2): Depois de criar perguntas mais simples do que as que foram respondidas ontem, eu tenhoalguma cois sólido hoje. O que posso dizer com certeza é o seguinte:

As CGImages por trás de uma UIImage não usam alfa. (kCGImageAlphaNoneSkipLast). Eu pensei que talvez eles fossem mais rápidos para desenhar, porque meu contexto estava usando alfa. Então, mudei o contexto para usar o kCGImageAlphaNoneSkipLast. Isso torna o desenho MUITO mais rápido, A menos quDesenhar em um CGContextRef com UIImage PRIMEIRO, torna TODO o desenho da imagem subsequente lento

Eu provei isso por 1) primeiro criando um contexto não-alfa (1936x2592). 2) Preencha com quadrados 2x2 aleatoriamente coloridos. 3) O quadro completo que desenhava uma CGImage naquele contexto era RÁPIDO (0,17 segundos). 4) Experiência repetida, mas preenchia o contexto com uma CGImage desenhada, apoiando uma UIImage. O desenho subsequente da imagem em tamanho cheio foi de mais de 6 segundos. SLOWWWWW.

e alguma forma, desenhar em um contexto com uma UIImage (grande) atrasa drasticamente todos os desenhos subseqüentes nesse context

questionAnswers(2)

yourAnswerToTheQuestion