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):
- UIKit crea un
CGBitmapContext
del tamaño de los límites de su vista, en píxeles del dispositivo - Hace que el contexto sea el contexto actual
- Dibujas tu
CGImage
en ese contexto - ... por lo que CG tiene que reescalar la imagen de origen y tocar todos los píxeles de destino
- Después de que termine de dibujar, UIKit crea una imagen
CGImage
desde el contexto del mapa de bits - 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
).