UIImage drawInRect: es muy lento; ¿hay una manera más rápida?

Esto hace exactamente lo que necesita, excepto que toma alnetworkingedor de 400 milisegundos, lo cual es 350 milisegundos demasiado:

- (void) updateCompositeImage { //blends together the background and the sprites UIGraphicsBeginImageContext(CGSizeMake(480, 320)); [bgImageView.image drawInRect:CGRectMake(0, 0, 480, 320)]; for (int i=0;i<numSprites;i++) { [spriteImage[spriteType[i]] drawInRect:spriteRect[i] blendMode:kCGBlendModeScreen alpha:spriteAlpha[i]]; } compositeImageView.image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); } 

Las imágenes son bastante pequeñas y solo hay tres (el bucle for solo itera dos veces)

¿Hay alguna manera de hacerlo más rápido? ¿Aún siendo capaz de usar kCGBlendModeScreen y alpha?

usted puede:

  • get las imágenes CG de UIImages
  • luego dibujarlos en un CGBitmapContext
  • producir una image de eso

Usar CoreGraphics en sí mismo puede ser más rápido. La otra ventaja es que puedes realizar la renderización en un hilo de background. También considere cómo puede optimizar ese bucle y perfil utilizando Instrumentos.

Otras Consideraciones:

  • ¿Puedes networkingucir la calidad de la interpolación?
  • las imágenes de origen están networkingimensionadas de cualquier forma (puede ayudar si las networkingimensionas)

DrawInRect es lento. Período. Incluso en imágenes pequeñas es extremadamente ineficiente.

Si está haciendo muchos dibujos repetidos, eche un vistazo a CGLayer, que está diseñado para facilitar la reproducción repetida de los mismos bits