4

約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

4 に答える 4

3

残念ながら、これはOpenGLESの仕事のように聞こえます。アプリはゲームですか?

于 2012-07-03T23:48:07.550 に答える
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
}
}

つまり、自動リリースプールを実装する必要があり、画像をキャッシュするため、+(UIImage *)imageNamed:メソッドを使用しないでください。

更新 説明させてください。あなたの問題はメモリ管理に関連しています。アプリはデバイスのメモリを効率的に使用する必要がありますが、実際にはそうではありません。あなたのアプリがどのように機能するかはわかりませんが、一般的な考え方は上に示されています。 UPDATE 2は、ARCを使用しているかどうかを教えてください。

UPDATE 3私の奇妙な言葉で申し訳ありませんが、遅いです。私を許して :)

于 2012-07-03T23:50:12.540 に答える
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];
}
于 2012-07-04T00:27:10.980 に答える
1

友達のcocos2dを使っています。頭痛の種を自分で救ってください。あなたが話していることは、OpenGLES を使用すると 100 倍効率的に実行できます。ただし、OpenGL は不必要に複雑であり、cocos2d はその上に優れた抽象化レイヤーを提供するため、数行のコードでそれを行うことができます。

于 2012-07-04T10:07:10.500 に答える