iphone - apple - ios guidelines font
Imágenes vs. Gráficos Core (2)
En dispositivos iOS, ¿en qué ocasiones es mejor dibujar gráficos con Core Graphics que con archivos de imagen?
¿Cuáles son las ventajas de hacerlo en términos de recursos?
En mi experiencia, siempre es mejor usar imágenes desde un punto de vista de rendimiento, pero a veces es necesario dibujar cosas manualmente.
Imágenes vs Core Graphics es una distinción contundente. Los métodos para renderizar gráficos fuera de pantalla / en pantalla son más complejos al punto que necesita usar Instrumentos para descubrir qué está sucediendo realmente. Intenté proporcionar una descripción general aquí, pero esta respuesta podría mejorar algo de personas más informadas.
Procesamiento GPU vs CPU
Los gráficos siempre se muestran en pantalla por la GPU. Sin embargo, pueden ser generados por la GPU o la CPU, y pueden ocurrir en el código de usuario o en un proceso separado llamado "el servidor de render". Aquí hay un resumen:
CPU, código de usuario:
- Core Graphics y Core Text
-
drawRect()
. El resultado suele ser caché.
GPU, servidor de render:
- CALayer con un valor de
shouldRasterize
establecido en SÍ. Esto crea un caché de la capa y subcapas.
GPU, servidor de render, muy lento:
- CALayer usando máscaras (
setMasksToBounds
) y sombras dinámicas (setShadow*
). -
UIViewGroupOpacity
(UIViewGroupOpacity
).
GPU, rápido:
- Creación de imágenes a partir de archivos PNG. El estiramiento en imágenes estirables es solo GPU también.
Tenga en cuenta que el almacenamiento en caché solo es útil si la memoria caché se reutiliza. Si se desecha de inmediato, perjudica el rendimiento. Por ejemplo, una animación en caché donde los contenidos se estiran simplemente se puede almacenar en caché y reutilizarse, pero una animación en caché donde el cambio de contenido tendrá un rendimiento horrible.
Bitmaps vs dibujo
Los archivos de imagen son generalmente más rápidos.
- Los archivos de imagen se pueden descargar al disco con anticipación utilizando un almacenamiento en caché agresivo .
- Las imágenes se pueden leer y descomprimir desde el disco en el fondo.
- Las imágenes se pueden almacenar en la memoria caché si utiliza
imageNamed:
lugar deinitWithData:
El dibujo fuera de la pantalla requiere más trabajo, pero le permite lograr más.
- Puede animar gráficos complejos sin pérdida de calidad, ya que el gráfico se vuelve a escribir en cada fotograma.
- Puedes crear gráficos con i18n sobre la marcha.
- Debes desactivar la animación implícita de Core Graphics si no la necesitas. Ejemplo: UIView con esquinas redondeadas (solo necesita el redondeo, no la animación).
- Dibujar puede ser lo suficientemente complejo como para usar Instrumentos para ver a dónde va el tiempo.
- Es probable que el dibujo con drawRect se almacene en caché a menos que use enmascaramiento, sombras, suavizado de bordes u opacidad de grupo. Puede solicitar llamadas de caché
-[CALayer setShouldRasterize:YES]
y-[CALayer setRasterizationScale:]
.
Las imágenes que se pueden estirar, tanto si se leen a partir de archivos de imágenes como si se generan mediante dibujos, utilizan menos memoria. El estiramiento es una operación barata para la GPU.
El rendimiento es solo un problema si no hay suficiente. Use lo que sea más rápido para codificar a menos que se presione de otra manera El programa más rápido es el que llega primero al mercado.
Algunas lecturas interesantes:
- Diseño para iOS: Gráficos y Rendimiento . No te pierdas los comentarios de Andy Matuschak. Edité la respuesta original con mucho contenido de este artículo.
- WWDC 2011 > Marcos de aplicaciones> Sesión 121: Entender la representación de UIKit
- WWDC 2012 > Essentials> Sesión 238: Rendimiento de la aplicación iOS: Gráficos y animaciones
- WWDC 2012 > Essentials> Sesión 211: Creación de interfaces de usuario simultáneas en iOS
- WWDC 2012 > Essentials> Sesión 223: Mejora de la experiencia del usuario con vistas de desplazamiento
- WWDC 2012 > Essentials> Session 240: Puliendo las rotaciones de tu interfaz .