pulgadas precio mini caracteristicas performance ipad core-graphics retina-display

performance - precio - ipad mini caracteristicas



Dibujo de imagen con CoreGraphics en Retina iPad es lento (1)

En mi aplicación para iPad, estoy renderizando en un mapa de bits fuera de pantalla, y luego dibujando el mapa de bits en la pantalla. (Esto se debe a que quiero reutilizar el código de representación de mapa de bits existente.) En el iPad 2, funciona como un amuleto, pero en el nuevo iPad con pantalla Retina, dibujar el mapa de bits es realmente lento, aunque su resolución sigue siendo la misma. mismo.

Para dibujar el mapa de bits, usamos las funciones regulares de Quartz 2D: CGImageCreate con un proveedor de datos creado por CGDataProviderCreateWithData , formato RGBA de 32 bits con kCGImageAlphaNoneSkipLast . En el UIView que muestra el mapa de bits, en drawRect: usamos CGContextDrawImage para dibujarlo en el contexto devuelto por UIGraphicsGetCurrentContext .

Tenga en cuenta que ni siquiera estoy tratando de dibujar a doble resolución: por ahora estoy bien con la misma resolución que estaba usando en el iPad 2. Parece que CoreGraphics duplica internamente los píxeles y luego los envía a la GPU , a pesar de que CGImage que estoy haciendo debería estar bien para pasar directamente a la GPU. ¿Algunas ideas?


Parece que CoreGraphics duplica internamente los píxeles y luego los envía a la GPU.

Bastante. Más exactamente (en espíritu al menos):

  1. UIKit crea un CGBitmapContext del tamaño de los límites de su vista, en píxeles del dispositivo
  2. Hace que el contexto sea el contexto actual
  3. Dibujas tu CGImage en ese contexto
  4. ... por lo que CG tiene que reescalar la imagen de origen y tocar todos los píxeles de destino
  5. Después de que termine de dibujar, UIKit crea una imagen CGImage desde el contexto del mapa de bits
  6. y lo asigna al contenido de la capa de la vista.

la CGImage que estoy haciendo debería estar bien para pasar a la GPU directamente.

Si quiere que eso suceda, debe decirle al sistema que haga eso, cortando algunos de los pasos anteriores.

(No existe un vínculo entre UIKit, CoreAnimation y CoreGraphics que brinde una "ruta rápida" como la que usted espera).

La manera más fácil sería hacer un UIImageView , y establecer su image a un UIImage envolviendo su CGImageRef .

O bien, configure su view.layer.contents en su CGImageRef . (Y asegúrese de no anular -drawRect: no llame a -setNeedsDisplay , y asegúrese de que UIViewContentModeRedraw no sea UIViewContentModeRedraw . Es más fácil usar UIImageView ).