我该如何在iOS中动画200多张图片?

时间:2012-07-03 23:42:50

标签: iphone objective-c ios ipad animation

我想要在大约10秒钟的空间内制作200多张图像。我尝试通过将图像加载到数组中然后调用animationImages方法来使用startAnimating。这在模拟器中运行正常但是撞毁了iPad。

我尝试每隔1/25秒调用NStimer并在每次定时器触发时更改图像。这比以前的方法表现更好,它在模拟器中运行良好,但在iPad的(滞后)动画结束时也崩溃了。

有人可以帮助我并告诉我解决这个问题的理想方法吗?感谢。

原始代码:

- (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;
    }

}

编辑:一些不适合我的新代码

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;
    }

编辑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];

}

4 个答案:

答案 0 :(得分:3)

不幸的是,这听起来像是OpenGL ES的工作。应用程序是游戏吗?

答案 1 :(得分:3)

内存管理:)。

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
}
}

我的意思是,你必须实现autoreleasepools并且不要使用+(UIImage *)imageNamed:方法,因为它会缓存图像。

<强>更新 让我解释。您的问题与内存管理有关。您的应用必须有效地使用设备的内存,但实际上并非如此。我不知道你的应用程序是如何工作的,但总体思路如上所示。 更新2 让我知道您是否使用ARC。

更新3 对不起我的奇怪语言,但已经很晚了。原谅我:)

答案 2 :(得分:3)

尝试使用CALayer隐式动画。创建图层并在循环中设置图像,如下所示:

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];
}

现在,您可以通过设置属性来隐式启动图层动画:

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

完成图层后,将其从superview中删除:

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

答案 3 :(得分:1)

使用cocos2d我的朋友。省去头痛。你所说的是用OpenGLES提高效率的百倍。但是,OpenGL是不必要的复杂,cocos2d提供了一个很好的抽象层,所以你可以用几行代码来完成它。