2012-05-02 12 views
10

En mi aplicación para iPad, estoy procesando 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.Imagen de dibujo con CoreGraphics en Retina El iPad es lento

Para dibujar el mapa de bits, utilizamos las funciones regulares de cuarzo 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 está doblando internamente los píxeles, y luego enviando eso a la GPU, a pesar de que el CGImage que estoy haciendo debería estar bien para pasar a la GPU directamente. ¿Algunas ideas?

Respuesta

15

Parece que CoreGraphics se duplica internamente los píxeles, y luego envía de que a la GPU,

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

  1. UIKit hace un CGBitmapContext el tamaño de los límites de su visión, en píxeles del dispositivo
  2. Se hace ese contexto, el contexto actual
  3. sacar sus CGImage en ese contexto
  4. ... así CG tiene que cambiar la escala de la imagen de origen, y tocar todos los píxeles de destino
  5. Después de que haya terminado el dibujo, UIKit hace un CGImage del contexto de mapa de bits
  6. y lo asigna al contenido de la capa de la vista.

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

Si desea que esto suceda, debe indicarle al sistema que lo haga, cortando algunos de los pasos anteriores.

(no hay ningún vínculo entre UIKit, CoreAnimation y CoreGraphics que proporciona una "vía rápida" al igual que usted está esperando.)

La forma más fácil sería hacer un UIImageView y establezca su image a un UIImage envolviendo su CGImageRef.

O bien, configure su view.layer.contents en su CGImageRef. (Y asegúrese de no anulación -drawRect:, no llamada -setNeedsDisplay, y asegúrese de que es contentModenoUIViewContentModeRedraw. Más fácil de usar sólo UIImageView.)

+0

Gracias por la información, que probablemente va a ayudar mucho. La vista está animada, por lo que se vuelve a dibujar a menudo. Creo que, por lo tanto, usando view.layer.contenido es probablemente más eficiente que asignar una nueva imagen a UIImageView, ¿verdad? –

+1

Lo intenté y el método view.layer.contents funciona estupendamente, ¡gracias de nuevo! –

+0

AFAIK los dos métodos son casi iguales en rendimiento, pero como siempre: si es importante, pruébelo y vea. –

Cuestiones relacionadas