0

このアプリは、OpenGL ES2 と GLKit フレームワーク、および GLKitViewController によって提供されるレンダリング/更新ループを使用します。以前は iOS7.1 の iPad2 で安定した 60 fps で実行されていましたが、iPad2 を iOS8.1 に更新すると、まったく同じコードが 56 ~ 59 FPS の間で変動するようになりました。(ただし、CPU 使用率は以前のように 40 ~ 60% のままです)。

プロファイリングにより、OpenGL 描画コマンドが以前よりもはるかに多くの CPU 時間を使用していることが明らかになりました。最大の変更点は、"GLKBaseEffect prepareToDraw" の呼び出しに以前よりもはるかに時間がかかることです。

(このアプリは、レンダリング ループ中のさまざまな時点で再構成される単一の GLKBaseEffect を使用するため、毎回 prepareToDraw を呼び出す必要があります。GLKBaseEffect の複数のインスタンスを使用することで最適化できる可能性があることに気付きました。これについては後で検討していました。 、しかし、iOS7.1でのパフォーマンスはそのままでした)

現在、Instruments の OpenGL ES アナライザー トレースを調べて、"GLKBaseEffect prepareToDraw" によって生成された OpenGL 呼び出しを特定し、異常と思われるものがあるかどうかを確認しています。

この時点でどのように進行するかについてのガイダンスに非常に感謝しています-iOS8.1でGLKBaseEffect prepareToDrawの呼び出しに時間がかかるのはなぜですか?

4

1 に答える 1

0

この問題の原因は Jim Hillhouse によって特定され、Frogblast によって Apple Dev Forums スレッド「iOS 8 GM で OpenGL Performance Drops > 50%」で確認されました。 GLKView のサブビューであるビューが原因で、GLKView スーパービューがレイアウトされ、フレームバッファの割り当てが解除され、再割り当てされます。これは iOS 7 では発生していませんでした。

Jim Hillhouse の回避策は、サブビューを UIViewController 内に配置し、それを GLKView に埋め込むことでした。ビュー コントローラーを保持するためにコンテナー ビューを使用して同じことを行い、それが機能することを確認できます。

于 2014-12-10T12:07:11.673 に答える