2011-01-31 16 views
7

Estoy agregando varios CALayers como subcapas de la capa de un UIView. El contenido de cada capa es una imagen diferente descargada de un servidor. Cada capa está animada desde fuera de pantalla a una posición generada aleatoriamente. Los datos de imagen se descargan de manera asincrónica. Cada imagen es aproximadamente 300x300 o más pequeña.¿Optimizaciones CALayer?

Como resultado de la colocación aleatoria, las capas se superponen y algunas quedan oscurecidas por las capas que están encima de ellas. Esto está todo bien.

Estoy eliminando capas, ya que se oscurecen por completo al ver la sugerencia en the answer to this question Los cálculos para determinar la cobertura se producen en un hilo separado.

Tengo un UIPanGestureRecognizer que permite al usuario arrastrar las capas en la pantalla.

Me encuentro con un problema de rendimiento cuando la cantidad de capas agregadas se aproxima a 25-30 y empeora progresivamente. Las animaciones se vuelven entrecortadas y a menudo están completamente ausentes (las capas recién agregadas simplemente aparecen en su posición final). Y los gestos de panoramización se ignoran o dan como resultado un reposicionamiento picado de la capa seleccionada.

Supongo que estoy matando a la GPU con todas las capas superpuestas y otra capa animando arriba?

¿Alguna sugerencia sobre cómo mejorar el rendimiento?

¿Mejores prácticas para manejar grandes cantidades de capas?

¿Es mejor que la capa comience animada en una capa de vista separada que las capas agregadas anteriormente?

Gracias!

Respuesta

4

Un par de cosas rápidas para comprobar.

Ejecute el Instrumento de animación Core y busque la opacidad. Simplemente establecer el indicador opaco de la capa en SÍ no es suficiente, si la imagen subyacente tiene un componente alfa, la capa tendrá eso en cuenta.

Si los datos que obtiene de su servidor tienen alfa, debe volver a dibujar con Cuarzo y guardar el archivo localmente en el nuevo formato que no incluye alfa.

Asegúrate doblemente de que no estás poniendo imágenes de 1 megapíxel en mosaicos de 100x100. También Core Animation Instrument, al encender 'Color Misaligned Images' y buscar amarillo.

30 a 50 capas no deberían ser un problema.

+0

Gracias Bill. Lo intentaré. Tenía la impresión de que opaco se ignoraba al suministrar layer.contents (¿solo se usa cuando se dibuja una capa?). El bit alfa será más complicado: estoy usando un borde transparente ancho de 2 píxeles alrededor del borde de las imágenes para suavizar los bordes girados. ¡Fuera a Instrumentos! – TomH

+0

Hola Tom - yep opaque se ignora a menos que dibuje, puedes pensar que es el 2º arg de UIGraphicsBeginImageContextWithOptions, si tu contenido tiene un canal alfa, entonces la capa será transparente - si tienes tiempo, archiva un error sobre el indicador edgeAntialiasingMask –

+1

Increíble.He estado agregando un canal alfa a mi UIImage, agregando un borde transparente de 2 píxeles y luego usando la imagen como contenido de la capa. El rendimiento se mejora mucho al no agregar el borde alfa y transparente, no hay problemas con> 30 capas. Lamentablemente, edgeAntialiasingMask no parece tener ningún efecto. Voy a presentar un error. – TomH

3

Si todas las capas no caben en la memoria de la GPU o en una parte de la memoria, las cosas se ralentizarán mucho. Se informa que cargar y descargar la memoria de la GPU es bastante lento en comparación con las capas de composición en la memoria de la GPU. Tendrá que experimentar con este límite de memoria, ya que los dispositivos más antiguos tienen menos memoria GPU disponible que los dispositivos más recientes.