2012-01-11 15 views
8

Esto no es realmente una pregunta sobre cómo abordar un problema específico sino más bien una solicitud para que se apunte en la dirección correcta.UIImageView vs UIView w/Image - efficiency

Estoy haciendo una aplicación donde estoy cargando varias imágenes (guardadas como JPG) en una pantalla al mismo tiempo y esto tiene que ser así, no puedo descargar ninguna de ellas porque todas están siendo mostrado de una vez

He intentado cargar 30 imágenes a aproximadamente 800px * 600px de resolución pensando ingenuamente que solo carga el tamaño 'comprimido' de las imágenes en la memoria (esto es aproximadamente 200 KB) - ¿entonces un total de 6 MB? Por supuesto, varias advertencias de memoria más tarde, me di cuenta de lo estúpido que era. Así que ahora los vuelvo a tamaño de aproximadamente 400px * 300px cada uno y mi iPhone 4S apenas hace frente a los requisitos de memoria.

Originalmente utilicé UiView, donde en el drawRect dibujé una imagen dibujada personalizada, pero cambiar a usar un UIImageView mejoró la situación dramáticamente. La aplicación es mucho más rápida y receptiva. También encontré que apagar la rasterización en mi capa suponía una gran diferencia en el rendimiento.

Este tipo de 'descubrimientos' me han tomado horas para resolverse y lo que me preguntaba era si hay patrones de diseño o recursos particulares que pueda usar para cargar mis imágenes a la pantalla de la manera más eficiente posible; principalmente con respecto al uso de la menor cantidad de memoria posible, ¿existen buenas reglas generales? ¿Por qué usar UIImageView vs UiView w/image hace una gran diferencia?

Estaría muy agradecido si alguien pudiera ayudar.

Gracias.

Respuesta

9

Al implementar -drawRect:, el sistema asigna una imagen de mapa de bits del mismo tamaño que su vista (después de todo, necesita un búfer para dibujar). Si todo lo que hace es dibujar una imagen que ya ha cargado, de una sola vez ha duplicado el uso de la memoria para esa imagen (porque tiene la copia que ha cargado y la segunda copia que acaba de dibujar).

De manera similar, las capas de rasterización requieren asignar imágenes de mapa de bits del mismo tamaño que la capa, por lo que tiene un búfer para rasterizar. Así que activarlo también absorbe la memoria (proporcional al tamaño de la capa).

La regla básica es, no hacer un trabajo extra. Usar -drawRect: para dibujar una imagen es trabajo adicional. Rasterizar una capa es trabajo adicional (aunque, dependiendo de la capa, puede ser un costo de rendimiento de una sola vez (y un costo de memoria constante) para ahorrar en el rendimiento más tarde, por ejemplo, si es un CAShapeLayer o si dibuja sombras) Mantener grandes imágenes en la memoria que siempre se reducen antes de renderizarlas en la pantalla es un trabajo extra (simplemente reduzca la escala una vez cuando cargue la imagen y mantenga la copia escalada a su alrededor).

Otra cosa a tener en cuenta es que si su objetivo es dibujar imágenes, intente usar UIImageView si es posible. En general, es la forma más rápida y económica de obtener una imagen en la pantalla, y es razonablemente flexible.

8

El patrón de diseño es básicamente, use UIImageView. Apple pasó mucho tiempo haciéndolo rápido, y Apple puede usar API privadas que usted no es.

Dicho esto, si quiere hacerlo usted mismo, intente utilizar un CALayer por imagen. Solo carga una imagen y la configura como la propiedad content de CALayer. El CALayer puede almacenar sus contenidos en la memoria de la GPU, y puede hacer otras optimizaciones que no se pueden hacer con las API públicas.

Puede aprender mucho sobre cómo hacer que su UI sea más rápida viendo los videos de desarrollo de Apple. Incluyen muchos consejos e "información interna" que no están en la documentación escrita o son difíciles de encontrar/fáciles de pasar por alto en los documentos. Los videos de desarrollo están aquí: http://developer.apple.com/videos/. Algunos buenos pertinentes a su pregunta:

  • IOS - "Comprensión iOS Ver Composición"
  • WWDC 2011 - "Representación entendimiento UIKit"
  • WWDC 2011 - "Dibujo práctica para los desarrolladores de iOS"
  • WWDC 2011 - "Core Animation Essentials"
  • WWDC 2010 - "Core Animation en la práctica"
+1

Gracias por los enlaces - que eran muy útiles. – Vazzyb

+2

+1 por sugerir algunos videos de Apple (¡sobre todo porque la interfaz de Apple para buscar y ver esos videos es terrible!) –

+0

@KevinZych ¿Alguna vez ha utilizado [asciiwwdc.com] (http://asciiwwdc.com)? – Honey