1

私はいくつかの画像をアニメーション化しようとしています。画像は Retina 以外の iPad でも問題なく動作しますが、対応する Retina は遅く、アニメーションは指定された速度で循環しません。私が使用しているコードは以下のとおりで、1/25 秒ごとにメソッドが呼び出されます。この方法は よりもパフォーマンスが優れているようですUIViewAnimations

if (counter < 285) {
        NSString *file = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"Animation HD1.2 png sequence/file_HD1.2_%d", counter] ofType:@"png"];
            @autoreleasepool {
                UIImage *someImage = [UIImage imageWithContentsOfFile:file];
                falling.image = someImage;
            }
        counter ++;
    } else {
        NSLog(@"Timer invalidated");
        [timer invalidate];
        timer = nil;
        counter = 1;
    }
}

たくさんの画像があることに気づきましたが、フレームの少ないアニメーションでもパフォーマンスは同じです。私が言ったように、非網膜アニメーションはうまく機能します。上の各画像は約 90KB です。私は何か間違ったことをしていますか、それとも単に iPad の制限ですか? 正直なところ、複雑な 3D ゲームなどを処理できるのに、このようなことを処理できないとは信じがたいので、何か間違ったことをしていると思います。どんな助けでも大歓迎です。

編集1:

以下の回答から、コードを編集しましたが、役に立ちませんでした。以下のコードを実行すると、デバイスがクラッシュします。

viewDidLoad

NSString *fileName;
myArray = [[NSMutableArray alloc] init];
for(int i = 1; i < 285; i++) {
    fileName = [NSString stringWithFormat:@"Animation HD1.2 png sequence/HD1.2_%d.png", i];
    [myArray addObject:[UIImage imageNamed:fileName]];
    NSLog(@"Loaded image: %d", i);
}
falling.userInteractionEnabled = NO;
falling.animationImages = humptyArray;
falling.animationDuration = 11.3;
falling.animationRepeatCount = 1;
falling.contentMode = UIViewContentModeCenter;

アニメーション方式

-(void) triggerAnimation {
    [falling startAnimating];
}
4

3 に答える 3

11

まず第一に、Retina iPad でのアニメーションのパフォーマンスが途切れ途切れであることで知られています。とはいえ、アニメーションで最高のパフォーマンスを得るためにできることがいくつかあります (順不同)。

  1. 画像のプリロード- 他の人が言及したように、描画する前に画像の読み取りを待たなければならない場合、アニメーションの速度が低下します。UIImageView のアニメーション プロパティを使用すると、このプリロードは自動的に処理されます。

  2. 適切な画像タイプの使用- ファイル サイズの利点にもかかわらず、PNG の代わりに JPEG を使用すると、アニメーションが大幅に遅くなります。PNG は圧縮率が低く、システムによる解凍が容易です。また、Apple は、PNG 画像の読み取りと描画のために iOS システムを大幅に最適化しました。

  3. ブレンディングの削減- 可能であれば、アニメーション イメージから透明部分を削除してみてください。画像が完全に不透明に見える場合でも、画像にアルファ チャネルがないことを確認してください。プレビューで画像を開き、インスペクターを開くことで確認できます。これらの透明なピクセルを削減または削除することで、画像を表示するときにシステムが実行する必要のある余分なレンダリング パスを排除できます。これにより、大きな違いが生じる可能性があります。

  4. GPU を利用したアニメーションの使用- タイマーを使用して画像をアニメーション化する現在の方法は、最適なパフォーマンスを得るために推奨されません。UIViewAnimation または CAAnimation を使用しないと、CPU にほとんどのアニメーション作業を強制することになります。Core Animation と UIViewAnimation のアニメーション技術の多くは、GPU を使用して画像とアニメーションを処理する OpenGL によって最適化およびサポートされています。グラフィックス処理は GPU の目的であり、それを利用することでアニメーションのパフォーマンスを最大化できます。

  5. ピクセルのずれを回避する - アニメーション画像を表示するときは、画面上で適切なサイズであることを確認してください。アニメート中または不適切なフレームを使用しているときに画像を引き延ばしている場合、システムは各フレームを処理するためにより多くの作業を行う必要があります。また、フレームまたはポイントの値に整数を使用すると、システムが画像を小数ピクセルに配置しようとしたときにアンチエイリアシングが発生しなくなります。

  6. 影と角の丸みに注意してください- CALayer には、影と角の丸みを作成する簡単な方法がたくさんありますが、これらのレイヤーをアニメーションで移動すると、多くの場合、システムはアニメーションの各フレームでレイヤーを再描画します。これは、shadowOffset プロパティを使用してシャドウを指定する場合です (UILabel のシャドウ プロパティを使用すると、すべてのフレームがレンダリングされません)。また、境界線と maskToBounds および clipToBounds の使用は、実際のアセットをトリミングするために画像エディターを使用するよりも、より多くのパフォーマンスを必要とします。

于 2012-09-08T00:38:55.983 に答える
0

指摘したいだけです-画像名で NSString を作成しているとき-「アニメーション HD1.2 png シーケンス/HD1.2_%d.png」とは何ですか?

そこにパスを配置しようとしているようです。画像名だけを試してください。"HD1.2_%d.png".

于 2012-09-30T15:32:45.870 に答える
0

ここで注意すべき点がいくつかあります:
「落下」が UIImageView である場合、そのコンテンツ モードが「中心」のようなものであり、ある種のスケーリングではないことを確認してください (もちろん、画像がそれに適合することを確認してください)。
それ以外は、@FogleBirdが言ったように、デバイスにすべての画像をプリロードするのに十分なメモリがあるかどうかをテストし、そうでない場合は、画像ファイルで NSData オブジェクトを作成して、少なくともデータをプリロードしてみてください。
@autorelease プールの使用はあまり役に立ちません。単一のことを行う自動解放オブジェクトを作成することになります-既に保持されているオブジェクトへの参照を削除します-メモリは得られませんが、パフォーマンスは低下します。
どちらかといえば、ファイル名フォーマッタ コードをラップする必要があり、このメソッドが NSTimer によって呼び出されることを考慮すると、既に自動解放プールにラップされています。

于 2012-09-08T00:12:13.203 に答える