我应该如何去了解iOS动画超过200个图像?(How should I go about anima

2019-09-19 01:30发布

我有超过200幅我想动画超过10秒左右的空间。 我已经尝试使用animationImages通过将图像加载到一个数组,然后调用startAnimating方法。 这没关系曾在模拟器,但坠毁的iPad。

我试图调用一个NStimer秒的每1/25,并且每个定时器烧制时间改变图像。 这比以前的方法表现较好,但在模拟器上运行良好,而且附近坠毁在iPad上(laggy)动画的结尾。

有人能帮助我,并告诉我处理这个问题的理想方式? 谢谢。

原始代码:

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

}

Answer 1:

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



Answer 2:

内存管理 :)。

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:方法,因为它缓存图像。

UPDATE让我解释一下。 你的问题是相关的内存管理。 您的应用可以有效地使用设备的内存,但你实际上并不需要。 我不知道你的应用程序是如何工作的,但总体思路如上图所示。 更新2让我知道你是否使用ARC与否。

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



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

一旦你与层完成后,从上海华盈删除:

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


Answer 4:

使用cocos2d的我的朋友。 保存自己的头痛。 你所谈论的是一百倍更有效地OpenGLES完成。 然而,OpenGL是不必要的复杂,和Cocos2d在它提供了一个良好的抽象层,这样就可以通过代码的几行做到这一点。



文章来源: How should I go about animating over 200 images in iOS?