私は iP* ゲームを開発しており、UIKit と OpenGL ES 2.0 の両方を利用しています。UIKit 要素は OpenGL ビュー上にレンダリングされ、かなりの (任意の) 画面スペースを占有します。Apple が素晴らしい仕事をしたことは認めざるを得ず、ゲームのフレーム レートは常に 60 FPS です。
この結論に達するために、パフォーマンスに関して多くのテストを行いました。
- OpenGL ビュー上に多くの静的 (動かない) UIView を追加しました -- OK!
- カスタム コードを使用して同じ UIView をアニメーション化しました (ゲームの drawFrame メソッドで center プロパティを変更しました) -- OK!.
- UIViews の下に多くの OpenGL ES 要素を追加しました -- OK!
- 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 で実行されました。