¿Por qué CGContextDrawImage en drawRect inicialmente es lento?

Considere esta subclass UIView simple en una aplicación iOS con ARC habilitada que se basa en la vista cuando se toca la pantalla:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { CGPoint location = [[touches anyObject] locationInView:self]; int padding = brushSize / 2; CGRect brushRect = CGRectMake( location.x - padding, location.y - padding, brushSize, brushSize ); [self setNeedsDisplayInRect:brushRect]; } - (void)drawRect:(CGRect)rect { NSDate *start = [NSDate date]; CGContextRef context = UIGraphicsGetCurrentContext(); CGContextDrawImage(context, rect, brushImage); NSLog(@"%f", [start timeIntervalSinceNow]); } 

En este ejemplo, brushImage es un bitmap cuadrado, y brushSize es un int que describe el ancho y la altura del bitmap.

Consistentemente obtengo salida de logging como esta:

 -0.131658 -0.133998 -0.143314 -0.007132 -0.006968 -0.007444 -0.006733 -0.008574 -0.007163 -0.006560 -0.006958 

Las primeras llamadas a drawRect tardan mucho más en completarse que las llamadas subsiguientes, y drawRect continúa siendo consistentemente rápido a partir de entonces. Es solo en las primeras llamadas después de que se inicializa la vista que drawRect es lento.

Veo resultados similares en el simulador y en todos los dispositivos físicos que he probado. Las llamadas iniciales tardan mucho más en completarse.

¿Por qué es drawRect / CGContextDrawImage tan lento en las llamadas iniciales? Y lo más importante, ¿cómo puedo solucionar esto?

Comtesting el rect. Apuesto a que las tres primeras son actualizaciones de pantalla completa. Me encontré con este problema antes. IOS actualizará por la fuerza las primeras veces como pantalla completa sin importar lo que haga (probablemente por su sistema de almacenamiento en búfer GL). Si lo deja solo durante unos 5 segundos y luego dibuja algo nuevamente, obtendrá el mismo comportamiento. Nunca me di count de cuál era la causa real, y dudo que alguna vez lo haga :(.

Vea la pregunta que originalmente le pregunté: UIGraphicsGetCurrentContext () corta duración