0

最近、iPad2を5.xからiOS 6.0.1にアップデートし、xcodeを4.5.2にアップグレードしました。これで、ゲームをビルドして実行すると、60fpsでスムーズに実行されます。ただし、3Dモデルが画面に近づくと、フレームレートは40 fpsに低下し、モデルが画面から離れてもそこにとどまります。これを克服する方法はありますか、それともiOS6.0.1またはxcode4.5.2のバグですか?これはiOS6.0.1のある種の省電力機能でしょうか?どんな助けでもいただければ幸いです。

4

2 に答える 2

0

私が知る限り、iOS 6.0.1 または Xcode 4.5.2 にこれを引き起こす可能性のあるバグはありませんが、私は単なる iOS 開発者であり、これらのプロジェクトの品質管理を担当するエンジニアではありません。

この質問で入手できる最小限の情報で、モデルはミップマップされたテクスチャで描画されていると最初に推測します。カメラから離れている場合はテクスチャの小さいバージョンが使用されますが、カメラに近づくとテクスチャの大きいバージョンが使用されます。可能なチェックは、このモデルのテクスチャをオフにしてパフォーマンスをチェックすることです。それでも、私はテクスチャを使用していると仮定しているので、この提案はベースから外れている可能性があります.

この問題を診断する最善の方法は、Xcode 4.5 で利用可能な最新の OpenGL デバッグおよびプロファイリング ツールを使用することです。これらのツールの使用方法については、昨年夏の WWDC on OpenGL のセッション ビデオをご覧になることをお勧めします。

編集して、投稿されたシェーダーについてコメントします。

シェーダーはフラグメントを並列に処理できますが、シェーダーの条件がフラグメント間で異なる値に評価される場合、並列プロセスの数が減ります。OpenGL ES 2.0 Programming Guideの 156 ページを引用するには:

GPU は通常、複数の頂点を持つ頂点シェーダーまたは複数のフラグメントを持つフラグメント シェーダーを並列で実行します。並行して実行される頂点またはフラグメントの数は、GPU のパフォーマンス ターゲットによって異なります。if および if-else 条件ステートメントの bool_expression は、並行して実行される頂点またはフラグメントに対して異なる値を持つことができます。これは、GPU によって並列に実行される頂点またはフラグメントの数が減るため、パフォーマンスに影響を与える可能性があります。最高のパフォーマンスを得るには、並行して実行される頂点またはフラグメントと同じ bool_expression 値で条件付きステートメントを使用することをお勧めします。これは、均一な式が使用されている場合に当てはまります。

ブール値は各フラグメントで同じであるため、おそらく GPU は多くのフラグメントを喜んで処理します。次に、GPU は、ブール値が同じものを評価しなくなったフラグメントを取得し、フラグメントを並列処理しなくなります。これらが異なる値に評価される可能性があることを認識しているため、モデルがカメラから離れた後でも、GPU は並列処理を少なくしてフラグメントを処理し続けます。

一連の if ステートメントは、値を特定の状態にクランプします。おそらく、同様の結果が得られる方程式を書くことで問題が解決するかもしれません。次のようなものを試してください:

df = (floor(mod((((df + 0.2) * 10.0) / 3.0), 4.0)) * 3.0) / 10.0;

このコードを使用して実際にシェーダーをコンパイルしたわけではなく、範囲と完全に一致していないため、いくつかの調整が必要になる場合があります。しかし、これは並列処理を維持するはずです。

于 2012-12-13T21:25:31.117 に答える