0

アイコンを数秒間タッチしてホーム画面カスタマイズモードに入るときに、ホーム画面のアイコンとほぼ同じように回転する12のビューがあります。

3D変換コードを使用して回転を行います。それぞれの持続時間はわずか0.02秒で、加速度の測定時に回転の角度と方向が恒久的に変化します。

これらのビューのうち5つは問題ありませんが、12はパフォーマンスが非常に悪いです。ローテーションコードは次のとおりです。

CATransform3D rotatedTransform = CATransform3DRotate(CATransform3DIdentity, degrees * M_PI / 180.0, 0.0f, 0.0f, 1.0f);
self.layer.transform = rotatedTransform;

その周りにいくつかのコアアニメーションがラップされています。しかし、私は3Dのことを何もしていないので、ここではCPUの浪費が見られます。私は実際には2Dを回転させるだけで、他には何も回転しません。これらは単純なUIImageViewsですが、この回転アニメーションを自分で実行するカスタムクラスです。

2D空間で機能するはずの「アフィン」変換があると聞きました。この場合、それを2Dに変更することをお勧めしますか?

レイヤーまたはビューの変換を変更することを選択する必要がありますか?どちらが速いですか?

4

4 に答える 4

2
  1. それをサメ。続行するのに何が遅いのかを正確に知る必要があります。

  2. その更新間隔を0.02秒から0.1秒のようなものに増やしてみてください。それは受け入れられますか?

  3. すべての画像が一緒に回転している場合は、sublayerTransformそれぞれを個別に変換するのではなく、スーパーレイヤーでを使用します

  4. アニメーションをオフにせずに試して、コールバックが期待どおりに機能していることを確認してください(setDisableActions:on CATransaction)。あなたはそれらをオフにしたときにサメで遅いのと同じことを見ますか?

  5. スクロールビュー内でこれを行う場合は、他の問題が発生する可能性があります。画面のオン/オフなどに注意する必要があります。

  6. 3D変換は、CoreAnimationAFAIKのアフィン変換と同じ速度です。基本的なsin/cosのものはアプリの速度を低下させていません

あなたが達成しようとしている実際の効果についてのより多くの情報は、パフォーマンスを改善するのに本当に役立ちます。

画面上の画像の大きさはどれくらいですか?

于 2009-05-28T00:51:02.507 に答える
1

私のアドバイスは、OpenGL ES に移行することです。


Core Animation は "UITransformations" よりも少しきびきびしていますが、直面している問題は古典的なものです。多くの "仮想" スプライトが浮かんでいるフレーム ツー フレーム ベースのアクションを作成しようとしています。それは、UIKit の使用目的ではありません。特にあなたがやろうとしているアニメーション。回転には、ピクセル補間を計算するために三角法が必要です。かなり高額な手続きです。

アニメーションの強さ、同時にアニメーションするオブジェクトの数、および新しい変換を再計算する頻度に明確な制限がない限り、現時点での私の唯一のアドバイスは OpenGL ESです。

これまでの iPhone での私の経験は、かなり似通っています。アプリを改良するたびに、現在のプラットフォームでは処理できなくなりました。最終的に OpenGL ES を使用することになりましたが、これは学習曲線の価値があります。パフォーマンスは素晴らしいです。

「悪いニュース」で申し訳ありませんが、フレーム ツー フレーム ベースのアプリに UIKit と Core Animation を使用しないことを強くお勧めします

于 2009-05-25T12:55:39.797 に答える
1

CALayer のローテーションはハードウェアで加速され、2D と 3D の変換は非常に似ています。

サメは役に立ちますが、探しているものを知る必要があります。探しているのは、現在のコードのパフォーマンスを改善することではなく、コードを完全に削除することです。

各レイヤーの角度を変更する目的で、独自のコードを頻繁に使用しているように聞こえます。CAに仕事を任せれば勝ちです。

したがって、ここでの戦略は、CA に仕事を任せて、1 秒間に 50 回未満のコールバックを行う方法を見つけることです。

レイヤーごとにCAAnimationGroupいくつかを含めて、たとえば一度に 1 秒のアニメーションを設定するのはどうですか?CAPropertyAnimation

それを CA に渡すと、CA はそれを独自のスレッドで再生します。

于 2009-06-07T10:49:05.107 に答える
0

ビューを常に再描画しているように聞こえます。これを無効にして、アニメーションの最後にのみ再描画する方法があると確信しています。

于 2009-05-25T13:02:01.717 に答える