Cómo hacer animaciones usando imágenes de manera eficiente en iOS

¿Cómo puedo hacer animación en iOS sin consumir mucha memoria (o de manera eficiente) ya que actualmente estoy enfrentando problemas de locking?

Para una sola animación, tengo una secuencia de 100 imágenes y cada imagen tiene aproximadamente 40kb, así hay alrededor de 7 animaciones que sumn casi 700 imágenes.

Por ejemplo, aquí he mostrado una animación de muestra con 2 imágenes. Este es mi código actual para hacer animación.

/*First taking two images into an Array*/ NSArray *imageArray = [NSArray arrayWithObjects:[UIImage imageNamed:@"img1"],[UIImage imageNamed:@"img2"],nil]; /*Creating an image view as a layer for performing the animation */ imgView = [UIImageView alloc]; [imgView initWithFrame:CGRectMake(110,245,100,100)]; /*Setting the images for performing animations*/ imgView.animationImages = imageArray; imgView.animationDuration = 8.5 ;//delay for performing the animation imgView.animationRepeatCount = 1; /* ..and finally adding the animation to the current view */ [self.view addSubview:imgView]; [imgView startAnimating]; [imgView release]; [imgView stopAnimating]; imageArray = nil; [imageArray release]; 

¿Alguien puede sugerir alguna mejora en el código para que las animaciones se puedan realizar de manera eficiente o existe alguna otra alternativa como OpenGL o Core Animation, si es así puede alguien sugerir un código de muestra para hacerlo.

Mi sugerencia es usar Cocos2d, que es un marco basado en Open GL específicamente diseñado para juegos.

En tu caso, las ventajas que obtendrías son:

  1. usar atlas de textura en lugar de imágenes individuales para guardar tanta memoria como sea posible;

  2. usando el formato PVR para sus imágenes (vs. PNG); PVR es el formato nativo del chip gráfico de iPhone / iPad, y permitirá un mayor ahorro de memoria;

  3. también podría intentar utilizar un formato de huella más pequeño para sus imágenes (es decir, RGB565 en lugar de RGB8888, 16 bits por píxel en lugar de 32).

Si crees que esto podría funcionar para ti, echa un vistazo a este tutorial .

Podrías hacer lo mismo usando Open GL o Core Animation directamente, pero creo que es mejor dejar que Cocos2d se ocupe de las cosas de bajo nivel.

Para un tutorial basado en Core Animation para hacer lo mismo, eche un vistazo a esta publicación . Como verá, implementará algunas clases para hacer cosas que Cocos2d ya le ofrece (junto con muchas otras características).

El enlace de mysterycoconut anterior es bueno ya que evita la publicación refleja “use Cocos2D” que siempre parece aparecer cuando las personas hacen una pregunta relacionada con la animación de CoreGraphics en SO. La raíz del problema que se está ejecutando es una API de animaciones de imágenes mal pensada que consume demasiada memoria de la aplicación y nunca debe utilizarse. Puede leer una descripción detallada del problema en el uso de Video y Memoria en dispositivos con iOS . Mi propia solución al problema se describe allí. Básicamente, desea descomprimir datos de imagen en un archivo y luego ajustar el contenido en la tarjeta gráfica. Esto es muy rápido en iOS y CoreGraphics utiliza una lógica de textura optimizada en el nivel de la tarjeta gráfica que limita las copias de almacenamiento intermedio para que la CPU del dispositivo se use muy poco. Con este enfoque, es posible obtener una animación muy rápida (de 45 a 60 FPS) de cientos de imágenes sin utilizar toda la memoria de la aplicación utilizando solo CoreGraphics.