2010-11-28 10 views
7

A partir de los documentos:Entonces, ¿un CALayer no contiene un mapa de bits de contenido de una vista?

"capas son objetos ligeros (CALayer) que, aunque similar a vistas, son en realidad objetos asignados a puntos de vista del modelo."

Ligero para mí excluye cualquier mapa de bits pesado para el contenido. Creí que un CALayer es lo "real", mientras que UIView es lo único que lo rodea. Cada vista tiene 3 CALayers en diferentes árboles (modelo, presentación, render). Entonces, ¿no hay 3 mapas de bits? ¿Solo uno?

Respuesta

17

El término "peso ligero" en referencia a un CALayer proviene de esa documentación originada en la Mac. Como señala Joe, un NSView es un elemento de interfaz de usuario bastante complejo en comparación con el UIView del iPhone. Puede animar docenas de UIViews alrededor de la pantalla, incluso en un dispositivo móvil con recursos limitados, pero los NSView ponen mucha más tensión en el sistema a medida que comienza a agregar muchos de ellos a la pantalla. Esta es una de las cosas ganadas con el nuevo inicio de UIKit sobre AppKit, porque UIKit ha tenido Core Animation desde el principio, y Apple tuvo la oportunidad de aprender de lo que funcionó y lo que no funcionó en AppKit.

En comparación, un CALayer agrega muy poco a la textura rectangular de mapa de bits subyacente basada en GPU que está dibujando, por lo que no agrega mucha sobrecarga. En un iPhone, esto no es muy diferente de un UIView, porque un UIView es simplemente un envoltorio liviano alrededor de un CALayer.

Voy a estar en desacuerdo con el conde Chocula sobre esto, y decir que un CALayer parece envolver una textura de mapa de bits en la GPU. Sí, puede especificar un dibujo de cuarzo personalizado para componer el contenido de la capa, pero ese dibujo solo se lleva a cabo cuando es necesario. Una vez que se dibuja el contenido de una capa, no es necesario volver a dibujar para que la capa se mueva o se anime de otra forma. Si aplica una transformación a una capa, verá que se pixelada al acercarse, una señal de que no se trata de gráficos vectoriales.

Además, con el marco de Trazado central (y en mis propias aplicaciones), tuvimos que anular el proceso de dibujo normal de CALayers porque el enfoque normal -renderInContext: no funcionó bien para los archivos PDF. Si usa esto para representar una capa y sus subcapas en un PDF, encontrará que las capas están representadas por mapas de bits ráster en el PDF final, no los elementos vectoriales que deberían ser. Solo al utilizar una ruta de representación diferente pudimos obtener el resultado correcto para nuestros archivos PDF.

Todavía tengo que jugar con las nuevas propiedades shouldRasterize y rasterizationScale en iOS 3.2 para ver si cambian la forma en que se maneja.

De hecho, encontrará que los CALayers (y UIViews con sus capas de respaldo) consumen mucha memoria cuando se toman en cuenta sus contenidos de mapa de bits. La medida "liviana" es cuánto agregan sobre el contenido, que es muy poco. Es posible que no vea el uso de memoria de un instrumento como Asignaciones de objetos, pero observe el Monitor de memoria cuando agregue capas grandes a su aplicación y verá picos de memoria en su aplicación o en SpringBoard (que posee el servidor Core Animation).

Cuando se trata de la capa de presentación frente a la del modelo uno, el mapa de bits no se duplica entre ellos. Solo debería haber una textura de mapa de bits que se muestra en la pantalla en un momento dado. Las diferentes capas simplemente rastrean las propiedades y animaciones en un momento dado, por lo que se almacena muy poca información en cada una.

+0

¡Georgeous! ¡Gracias! ¿De dónde sabes todo esto? ¿Dónde leer eso? –

+0

@BugAlert - Principalmente hablando con ingenieros y pasando mucho tiempo con CALayers en mis propias aplicaciones. Creo que Apple difunde sugerencias sobre esto a través de los videos de la WWDC de Animación central para 2010, así como en los videos de la WWDC 2009 sobre la optimización del rendimiento en el iPhone. La Guía de programación de Core Animation también entra en detalles sobre la arquitectura de renderizado. –

+0

¡Excelente respuesta, gracias por la enorme cantidad de información! –

2

De la manera que lo entiendo, un CALayer es una representación de una superficie de dibujo de Cuarzo. Realmente no se puede pensar en términos de mapas de bits, sino en un contenedor que encapsula el estado actual de un contexto de dibujo, incluidos sus contenidos, transformación, sombras, etc. Es, básicamente, lo más cerca que puede llegar a la GPU mientras permanece dentro de Cocoa, pero no es lo mismo que representar un mapa de bits, más bien, representa toda la información necesaria para reproducir sus contenidos como usted lo instruye. Entonces, por ejemplo, si dibuja una línea en él, la capa internamente podría simplemente pasar las coordenadas de la línea a la GPU y dejar que la última dibuje, sin tener que preocuparse por los píxeles necesarios para representarla.

En comparación con UIView, una capa es "liviana" en el sentido de que se ocupa exclusivamente de las operaciones de visualización, y no se ocupa de cosas como responder a eventos o toques, y más.

El motivo para tener tanto un modelo como una capa de presentación es que este último representa el estado actual de la capa, manteniendo todas las animaciones en cuenta. Es por eso que, por ejemplo, la documentación recomienda que realice pruebas de prueba en la capa de presentación.

+0

¿Cuándo quisiera hacer la prueba de impacto manualmente? Cuando ocurren animaciones en vuelo? –

+0

Siempre que desee comprobar si un punto reside en una jerarquía de capa determinada. Consulte esta pregunta para una discusión: http://stackoverflow.com/questions/2199171 –

+0

No estoy de acuerdo con usted cuando se trata de si un CALayer se almacena en caché como una textura de mapa de bits en la GPU. Como explico en mi respuesta, toda mi experiencia con ella (incluidas las conversaciones con los ingenieros de Apple) indica lo contrario. Los elementos del vector ciertamente no se vuelven a dibujar cada vez que se mueve o escala un CALayer, porque el rendimiento de eso sería terrible. De hecho, ve claramente pixelación cuando aplica una transformación de escala a un CALayer. –

Cuestiones relacionadas