8

私は iP* ゲームを開発しており、UIKit と OpenGL ES 2.0 の両方を利用しています。UIKit 要素は OpenGL ビュー上にレンダリングされ、かなりの (任意の) 画面スペースを占有します。Apple が素晴らしい仕事をしたことは認めざるを得ず、ゲームのフレーム レートは常に 60 FPS です。

この結論に達するために、パフォーマンスに関して多くのテストを行いました。

  1. OpenGL ビュー上に多くの静的 (動かない) UIView を追加しました -- OK!
  2. カスタム コードを使用して同じ UIView をアニメーション化しました (ゲームの drawFrame メソッドで center プロパティを変更しました) -- OK!.
  3. UIViews の下に多くの OpenGL ES 要素を追加しました -- OK!
  4. UIViews の下に多くの移動する OpenGL ES 要素を追加しました -- OK!

そこで、UIKit 要素をアニメーション化するために Core Animation Framework を利用したいと思います。私は利用します

[UIView animateWithDuration:delay:options:animations:completion:]

アニメーションを実行するため (私は iOS 4 以降をターゲットにしています)。

ここでの問題は、フレーム レートがこの奇妙な動作をすることです。多数のUIKit アニメーション要素で 60 fps を取得する場合があり(30 要素は私にとっては問題ありません)、単一のアニメーション UIKitを使用してもフレーム レートが明らかに 60 fps を下回る場合があります。要素ですが、楽器では測定できません!もっと説明しましょう: Instruments を開いてコア アニメーションや OpenGL ドライバーを監視すると、常に 60 fps になります。しかしこれが当てはまらないことは明らかです。OpenGL アニメーションが、上部の対応する UIKit アニメーションよりもはるかにゆっくりと移動することを目で見ることができます。ビューから UIKit 要素を削除すると、フレーム レートは通常に戻ります。ここで説明する状況と同様の状況は、ユーザーがゲームのプレイ中にデバイスの音量を変更すると、どの OpenGL ES ゲームでも発生します。現在のボリュームを示す透明なビューがフェードアウトし始め、完全にフェードアウトするまでフレームレートが大幅に低下しますが、機器では (私もこのテストを行いました) 60 fps のままです!

つまり、要約すると、ブロック アニメーションで実際の 60 fps が得られ、実行中に浮き沈みがない場合もあれば、偽の 60 fps で浮き沈みがない場合もあります。

これに対する解決策はありますか?すべてのテストは、iOS 5.1 を搭載した iPad 2 および iPhone 3GS で実行されました。

4

1 に答える 1

9

私はなんとか問題を解決し、パフォーマンスを低下させることなく、OpenGL ゲームで UIView ブロック/コア ベースのアニメーションを組み合わせることができるようになりました。

解決策は非常に簡単です。

  1. OpenGL アプリで必要な各 UIView について、その境界、中央、および変換プロパティを OpenGL 画面座標系に保持し (たとえば、次のプロパティを作成します: GLBounds、GLCenter、GLTranform)、対応する UIView のいずれかを変更するたびに、それに応じてそれらを更新します。プロパティ。
  2. ゲームを開始するとき、UIViews をロードしますが、それらをhiddenに設定します。そのため、UIKitは OpenGL ビューの上に描画しません(この方法で、フレーム ドロップの問題は完全に解消されます)。代わりに、ステップ 1 で作成した GL* プロパティを使用し、対応するテクスチャ (画像/色すべてのUIViewに使用しました)。
  3. 実現したいアニメーションに応じてブロック/コア アニメーションを使用して非表示のUIViews プロパティ (境界、中心、および変換) をアニメーション化し (これにより GL* プロパティが更新されます)、OpenGL 描画メソッドで GL* プロパティを使用して UIViews を描画します。 ! UIView がアニメーション化されている (および GL* プロパティを更新している) ときに境界、中央、および変換の実際の値を取得するには、その presentationLayer プロパティを使用します。

一番、

于 2012-04-21T13:51:24.223 に答える