¿Cómo debo hacer para animar más de 200 imágenes en iOS?

Tengo más de 200 imágenes que quiero animar en el espacio de alnetworkingedor de 10 segundos. He intentado usar animationImages cargando las imágenes en una matriz y luego invocando el método startAnimating . Esto funcionó bien en el simulador pero se estrelló en el iPad.

He intentado llamar a un NStimer cada NStimer de segundo y cambiar la image cada vez que se NStimer el timer. Esto funcionó mejor que el método anterior, funcionó bien en el simulador pero también se estrelló cerca del final de la animation (laggy) en el iPad.

¿Alguien puede ayudarme y decirme la forma ideal de abordar este problema? Gracias.

CÓDIGO ORIGINAL:

 - (void) humptyFallingAnim { NSString *filename; if (humptyImageCounter < 285) { filename = [NSString stringWithFormat:@"Humpty Animation HD1.2 png sequence/humpty_HD1.2_%d.png", humptyImageCounter]; UIImage *someImage = [UIImage imageNamed:filename]; humptyFalling.image = someImage; NSLog(@"loaded image: %d", humptyImageCounter); humptyImageCounter++; } else { NSLog(@"Timer invalidated"); [humptyTimer invalidate]; humptyTimer = nil; } } 

EDIT: Algún código nuevo que no funciona para mí

 NSString *filename; if (humptyImageCounter < 285) { filename = [NSString stringWithFormat:@"Humpty Animation HD1.2 png sequence/humpty_HD1.2_%d.png", humptyImageCounter]; @autoreleasepool { UIImage *someImage = [UIImage imageWithContentsOfFile:filename]; humptyFalling.image = someImage; NSLog(@"loaded image: %d", humptyImageCounter); } humptyImageCounter++; } else { NSLog(@"Timer invalidated"); [humptyTimer invalidate]; humptyTimer = nil; } 

EDIT 2:

 -(void) motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event { NSLog(@"You shook it!"); [self.view bringSubviewToFront:imgSnail]; if (deviceHasBeenShaken == 0) { deviceHasBeenShaken = 1; } humptyTimer = [NSTimer scheduledTimerWithTimeInterval:(1/25) target:self selector:@selector(humptyFallingAnim) userInfo:nil repeats:YES]; [self moveHumptyPosition]; } 

Desafortunadamente, esto suena como un trabajo para OpenGL ES. ¿Es la aplicación un juego?

Gestión de la memory :).

 NSString* somePath; UIImageView *imageView; for (i=0;i<200;i++) { @autoreleasepool { UIImage *someImage = [UIImage imageWithContentsOfFile:somePath]; imageView.image = someImage; //every time this line is executed, old reference disappears and previous UIImage is discarded } } 

Quiero decir, tienes que implementar autoreleasepools y no uses + (UIImage *) imageNamed: método, porque almacena imágenes en caching.

ACTUALIZACIÓN Déjame explicarte. Su problema está relacionado con la administración de la memory. Su aplicación tiene que usar la memory del dispositivo de manera eficiente, pero en realidad no lo hace. No sé cómo funciona tu aplicación, pero la idea general se muestra arriba. ACTUALIZACIÓN 2 me avisa si usa ARC o no.

ACTUALIZACIÓN 3 perdón por mi extraño lenguaje pero es tarde. Perdóname 🙂

Intente usar la animation implícita CALayer . Cree sus capas y configure sus imágenes en un ciclo, como sigue:

 NSMutableArray *allLayers = [NSMutableArray array]; for (int i = 0 ; i != 200 ; i++) { CGImageRef image = ...; // Get i-th image from an image source CALayer* sub = [CALayer layer]; sub.contents = (__bridge id)image; sub.contentsRect = CGRectMake(...); // Create a rectangle based on the image size [self.layer addSublayer:sub]; [allLayers addObject:sub]; } 

Ahora puede comenzar a animar sus capas implícitamente estableciendo sus properties:

 for (CALayer *sub in allLayers) { sub.position = CGMakePoint(...); // The position to which to move the image } 

Una vez que haya terminado con las capas, elimínelas de Superview:

 for (CALayer *sub in allLayers) { [sub removeFromSuperlayer]; } 

Utiliza cocos2d a mi amigo. Sálvate el dolor de cabeza. De lo que está hablando se hace cien veces más eficientemente con OpenGLES. Sin embargo, OpenGL es innecesariamente complicado, y cocos2d proporciona una buena capa de abstracción sobre él, de modo que puede hacerlo con algunas líneas de código.