En iOS, ¿cómo se muestran los maps de bits CALayer (objects CGImage) en la tarjeta gráfica?

En iOS, pude crear 3 objects de CGImage y usar un CADisplayLink a 60fps para hacer

 self.view.layer.contents = (__bridge id) imageArray[counter++ % 3]; 

dentro del ViewController , y cada vez, una image se establece en los contents CALayer de la vista, que es un bitmap.

Y esto por sí solo, puede alterar lo que muestra la pantalla. La pantalla simplemente recorrerá estas 3 imágenes, a 60 fps. No hay un drawRect de UIView, ningún display drawInContext , drawInContext o drawLayerInContext del delegado de drawLayerInContext . Todo lo que hace es cambiar los contents de CALayer.

También intenté agregar una subcapa de menor tamaño a self.view.layer , y establecer los contents esa subcapa en su lugar. Y esa subcapa recorrerá esas 3 imágenes.

Así que esto es muy similar a los viejos times, incluso en Apple] [o incluso en la era King's Quest III, que son videojuegos DOS, donde hay 1 bitmap, y la pantalla muestra constantemente lo que es el bitmap.

Excepto esta vez, no es un bitmap, sino un tree o una list enlazada de maps de bits, y la tarjeta gráfica usa constantemente el Modelo de pintor para pintar esos maps de bits (con position y opacidad) en la pantalla principal. Entonces, parece que DrawRect, CALayer, todo, fueron diseñados para lograr este propósito final.

¿Así es como funciona? ¿La tarjeta gráfica toma una list orderada de maps de bits o un tree de maps de bits? (y luego mostrarlos constantemente. Para simplificar, no consideramos la animation implícita en el marco de CA) ¿Qué sucede realmente en la capa de event handling tarjetas gráficas? (y en realidad, ¿es este método casi el mismo en iOS, Mac OS X y en las PC?)

(Esta pregunta tiene como objective comprender cómo nuestra progtwigción gráfica realmente se representa en las tarjetas gráficas modernas, ya que, por ejemplo, si necesitamos entender UIView y cómo funciona CALayer, o incluso utilizar el bitmap de CALayer directamente, necesitamos entender la architecture gráfica).

Las bibliotecas de pantallas modernas (como el cuarzo utilizado en iOS y Mac OS) utilizan la composition acelerada por hardware. El funcionamiento es muy similar a cómo funcionan las bibliotecas de charts de computadora, como OpenGL. En esencia, cada CALayer se mantiene como una superficie separada que se almacena en el búfer y se reproduce en el hardware de video de forma similar a una textura en un juego en 3D. Esto se implementa excepcionalmente bien en iOS y es por eso que el iPhone es tan conocido por tener una buena interfaz de usuario.

En los "viejos times" (es decir, Windows 9x, Mac OS Classic, etc.), la pantalla era esencialmente un gran framebuffer, y todo lo que estaba expuesto, por ejemplo, mover una window, tenía que ser networkingibujado manualmente por cada aplicación. El networkingibujado fue realizado principalmente por la CPU, que puso un límite superior en el performance de la animation. La animation usualmente era muy "parpadeante" debido al networkingiseño involucrado. Esta técnica fue especialmente adecuada para aplicaciones de escritorio sin demasiada animation. Cabe destacar que Android usa (o al less solía usar) esta técnica, que es un gran problema al transferir aplicaciones iOS a Android.

Los juegos de los días antiguos (por ejemplo, DOS, máquinas recreativas, etc., también se usaban mucho en Mac OS classic), algo llamado animation de sprite se usaba para mejorar el performance y networkingucir el parpadeo al mantener las imágenes en movimiento en los búferes fuera de pantalla que proporcionaban hardware y sincronizado con el vblank del monitor, lo que significaba que las animaciones eran suaves incluso en sistemas de muy baja gama. Sin embargo, el tamaño de estas imágenes fue muy limitado y las resoluciones de la pantalla fueron bajas, solo alnetworkingedor del 10-15% de los píxeles de incluso una pantalla de iPhone de hoy.

Tienes una intuición razonable aquí, pero todavía hay varios pasos entre los contents y la pantalla. En primer lugar, los contents no tienen que ser una image CGImage . A menudo es una class privada llamada CABackingStorage que no es exactamente lo mismo. En muchos casos, existen optimizaciones de hardware para pasar por alto la representación de la image en la memory principal y luego copyrla en la memory de video. Y dado que los contents de varias capas están todos juntos, todavía eres una forma de la memory de visualización "real". Sin mencionar que las modificaciones al contents solo impactan directamente en la capa del model, no en las capas de presentación o representación. Además, hay objects CGLayer que pueden almacenar su image directamente en la memory de video. Hay muchas cosas diferentes.

Entonces la respuesta es, no, el video "tarjeta" (chip; es el PowerVR BTW) no toma un montón orderado de capas. Toma datos de nivel inferior de forms que no están bien documentadas. Algunas cosas (particularmente partes de Core Animation y tal vez CGLayer) parecen ser envoltorios alnetworkingedor de las texturas de OpenGL, pero otros son probablemente Core Graphics que acceden directamente al hardware en sí. Una vez que llega a este nivel de la stack, es todo privado y puede cambiar de una versión a otra y de un dispositivo a otro.

También puede encontrar útil la respuesta de Brad Larson aquí: iOS: ¿se implementó Core Graphics además de OpenGL?

Es posible que también le interese el Capítulo 6 de iOS: PTL . Si bien no entra en los detalles de implementación, sí incluye mucha discusión práctica sobre cómo mejorar el performance del dibujo y utilizar el hardware con Core Graphics de la mejor manera. El Capítulo 7 detalla todos los pasos accesibles para desarrolladores involucrados en el dibujo de CALayer .