– hace que toda la capa sea networkingibujada

Estoy subclassando CALayer para proporcionar mi propio dibujo en el método. Para la optimization llamo -[MyLayer setNeedsDisplayInRect:] lugar de -[MyLayer setNeedsDisplay] . En el método de dibujo obtengo el rectángulo que debería networkingibujarse mediante CGContextGetClipBoundingBox() .

Si utilizo esta capa como la capa base de una UIView, todo funciona como se esperaba. El problema surge, tan pronto como uso mi capa personalizada como subcapa de otro CALayer. Que CGContextGetClipBoundingBox() siempre devuelve el rectángulo de los límites de esa capa.

¿Algunas ideas?

[EDITAR]

Parece que no hay garantía, que el contenido del CALayer se almacena en caching y que solo se vuelve a dibujar la parte sucia. Hice una pequeña testing y almacené el rectángulo que necesita mostrar como una propiedad separada. El resultado fue que solo esta parte estaba visible en la pantalla.

Ahora renderizaré en un context de image y mantendré esa image como caching. En el método draw solo mostraré la image en caching.

La documentation de Apple desafortunadamente está en conflicto ya que los documentos en -setNeedsDisplayInRect no indican si el método funciona en la práctica. Basado en mi propia experiencia, esta nota técnica lo establece directamente:

Tenga en count que, debido a la forma en que iPhone / iPod touch / iPad actualiza su pantalla, la vista completa se volverá a dibujar si llama -setNeedsDisplayInRect: o -setNeedsDisplay :.

Dicho eso, hay una serie de cosas que puedes ver si piensas que estás golpeando una panetworking debido al dibujo networkingundante.

  • Si dibuja imágenes, la mejor mejora de performance que puede hacer es usar imágenes de las mismas dimensiones en las que dibuja. Si no lo son, intente almacenar en caching su image procesándola en un context de bitmap fuera de pantalla y recuperarlo más tarde.
  • Echa un vistazo a la propiedad shouldRasterize en CALayer. Esto puede ser una bendición si está tratando de manipular una capa cuyas subcapas constituyen potencialmente una jerarquía de capas compleja. Asegúrese de ver cómo se encuentra en Instrumentos marcando el recuadro Color Hits Green and Misses Red en el instrumento Core Animation. Si ve mucho rojo, lo más probable es que use shouldRasterize está dañando más de lo que está ayudando.
  • Incluso mejor que shouldRasterize es aplanar la jerarquía de capas, ya que entonces puede evitar la sobrecarga extra que shouldRasterize en count cuando incurra el aplanamiento de la jerarquía de capas en time real. Por supuesto, esto no siempre es posible, pero no tengas miedo de intentarlo 🙂
  • Si está dibujando imágenes, intente experimentar con su modo de fusión . Si está dibujando imágenes opacas, no es necesario utilizar methods de fuente normales (que usan ancho de banda de lectura / escritura). Prueba kCGBlendModeCopy, que te permite eliminar la sobrecarga de ancho de banda de lectura.
  • Echa un vistazo a CGLayerRef, que te permite almacenar en caching la salida de Core Graphics en varias llamadas a tus methods de dibujo. Mi experiencia es que, a less que estés haciendo un empuje de píxel incondicional, esto termina siendo más costoso que volver a dibujar. Mira esto para una lectura interesante.
  • Sobre todo, Instruments es tu amigo. Echa un vistazo a un par de videos de anteriores WWDC ( 2012, 2011 y 2010 ); Todos tienen una gran información sobre cómo ajustar el performance.

Siéntase libre de hacer más preguntas si algo que he dicho tiene poco sentido.