2

UIViewアニメーションブロックを使用して、ディスプレイ上の複数のレイヤーのCALayerプロパティ(この場合はbackgroundColor)を一度にアニメーション化します。

すべてのレイヤーは不透明で、基本的にこのように、すべてを1つのブロックでアニメーション化しています。

[UIView beginAnimations:@"outer" context:nil];
float duration = .25;
float offset = 0.0;
for( NSArray *viewsInPass in viewQueue ) {
   for( UIView *innerView in viewInPass ) {
       [UIView beginAnimations:@"inner" context:nil];
       [UIView setAnimationDelay:offset];
       [UIView setAnimationDuration:duration];
       [innerView.layer setBackgroundColor:[newColor CGColog]];
       [UIView commitAnimations];
   }
   offset += duration;
}
[UIView commitAnimations];

これに4〜5の同時レイヤーがあり、背景色をアニメーション化すると、非常に途切れ途切れになり、デバイスは基本的にレンダリングレートを完全に失い始め、残りのアニメーションの最後までフリーズします。すべてのビューが重なることはなく、すべて不透明で、通常は約20x20ピクセルです。

特にQuartz2Dなどについて多くの満足のいくものを読んだ後、これがどれほどパフォーマンスが悪いかに少しショックを受けました。ここで基本的な何かを見逃しているに違いないと思います。

ヘルプ!

4

3 に答える 3

2

ビューの不透明度は、パフォーマンスへの最大の影響です。レンダリングプロセス全体を通して、ビューが重なって完全に不透明にならないようにすると(つまり、背景を含むビューシーケンスのどこにも透明度がない場合)、パフォーマンスがわずかに向上します。

私はなんとか30fps(つまり画面全体)で1つの大きなアニメーションを作成できましたが、メモリの制限(元のiPhone / iPod)に遭遇し、最終的にそれを超えて私を殺しました。そこに到達していること以上のものが必要な場合は、ゲームフレームワークを介して、または直接、OpenGLランドにアクセスする必要があります。そのループ内のObjective-C呼び出しのオーバーヘッドは、画像を循環しているのと同時にオフセットを変更できるようにするために、最終的にはあなたを殺します。

于 2010-07-13T02:22:22.113 に答える
1

編集:[削除]

前のアニメーションが終了するときに各アニメーションを開始するので、すべてのアニメーションを一度にキューに入れる代わりに、NSTimerまたはデリゲートdidFinishコールバックでそれぞれを開始できます。そうすれば、アニメーションシステムへの需要は少なくなります。

同時に異なる色でキューに入れられるビューがないことを確認する必要があります。

于 2010-07-13T02:50:15.827 に答える
1

問題は、最初のオフセットの間にある種のイプシロンを追加するために必要なすべてのことです。最終的に、各パスの末尾でn * 2がアニメーション化され、次のパスが一瞬だけ開始されます。何らかの理由で、これにより、アニメーションシステムが共有する単なる処理スライスであっても、アニメーションシステムがバーフになります。

それを作る

オフセット+=期間*1.05;

アニメーションを詰まらせるパス間のぎくしゃくした動きを解決しました。

于 2010-07-13T16:41:11.740 に答える