2012-03-30 3 views
5

私は、多くの看板を使用する3D iPhoneアプリケーションを作成します。 iPhone 4で品質を向上させたいので、フレームバッファが網膜画面上で2倍大きくなります。 問題は、フラグメントシェーダがフレームバッファサイズのために時間を消費することです。 シェーダ精度を上げずに網膜スクリーンや高解像度テクスチャを管理する方法はありますか?iOS上の網膜スクリーンのためのシェーダの最適化

答えて

9

Retinaディスプレイのフル解像度のフレームバッファでレンダリングしている場合、Retinaディスプレイ以外のディスプレイの同じ物理領域と比較して、ラスタオーバーするピクセルが4倍になります。シェーダの複雑さのために塗りつぶしのレートが制限されている場合、これにより、各フレームでレンダリングにかかる​​時間が長くなります。

まず、レンダリングパイプラインのフラグメント処理部分によって実際に制限されていることを確認する必要があります。アプリケーションに対してOpenGL ESドライバを実行し、TilerとRenderer Utilizationの統計を確認します。レンダラー使用率が100%に近い場合は、フラグメントシェーダーとピクセル全体のプッシュ機能によって制限されることを示します。ただし、Tiler Utilizationのパーセンテージが表示されている場合は、ジオメトリに制限があり、画面解像度の変更がパフォーマンスに影響を与えないことを意味します。これは、頂点データの複雑さとサイズを減らすことになります。

あなたがフラグメントシェーダーによって制限されているとすれば、iOS GPUのパフォーマンスを大幅に向上させるためにできることがいくつかあります。

あなたのケースでは、テクスチャサイズのように聞こえるかもしれません。まず、私は、標準のビットマップソースの代わりにPowerVR Texture Compressed(PVRTC)テクスチャを使用します。 PVRTCテクスチャは、圧縮されたフォーマットでメモリに格納され、同等のビットマップよりもはるかに小さくすることができます。これにより、テクスチャ読み込み時のキャッシュヒットが増え、アクセス速度が大幅に向上します。

テクスチャのサイズを2倍にし、ミップマップを有効にします。私はミップマップが実際に小さなオブジェクトに表示されるように縮小された大きなテクスチャに本当に役立つのを見ました。これは間違いなく、網膜および網膜以外の装置をサポートする必要のあるアプリケーションの場合のように聞こえます。

ペストのようなフラグメントシェイダーでの依存テクスチャーの読み込みを避けてください。テクスチャ座標を決定するために計算を実行するもの、または分岐ステートメントに含まれるテクスチャの読み込みは、依存するテクスチャの読み込みをトリガします。これは、iOS GPUで実行するのが一桁以上遅くなる可能性があります。通常のテクスチャ読み込みでは、PowerVR GPUはテクスチャ値より少し前に読み込みを行うことができますが、原因を依存テクスチャ読み込みを使用すると、その最適化が失われる可能性があります。

私はhad a little help in this area myselfを持っていますが、これらは、私が焦点を当てていた最初のもののように見えます(適切な場合はhighpの代わりにlowpまたはmediump精度を使用します)。最後に、PowerVR's profiling editorを使ってシェーダを実行することもできます。これにより、これらのシェーダの最高と最低のパフォーマンスのサイクルタイムの見積もりが得られます。

レティナディスプレイデバイスは、フラグメントシェーダの制限に関しては、最悪の犯罪者でさえありません。 iPhone 4/4Sよりも多くのピクセルを持ち、iPad 2/3またはiPhone 4Sよりもはるかに低速のGPUを搭載しているため、iPad 1のフルスクリーンに何らかのレンダリングを実行してみてください。あなたがiPad 1でうまく動作するようなものを手に入れることができれば、それ以外のすべてのもの(さらにはRetina iPad)でもうまくいくでしょう。

+0

このような精度をお寄せいただきありがとうございます。レンダラの使用率は約99%、Tilerは約5%です。私の看板のほとんどは2Dスプライトのように表示されるので(テクスチャはスケーリングされていません)、ミップマッピングはパフォーマンスを向上させません。私はPowerVRのプロファイリングエディタを試し、iPad 1で自分のアプリをテストします。 – Klem

+0

Bradに感謝します。私は過去6ヶ月間に狂ったようなシェーダをコーディングしていましたが、テクスチャ座標を変更する方法を学んだとき、それは私の脳内でオンになっている光のようでした。しかし、最近、2つの異なるテクスチャから読み込んだり、1つのテクスチャでベースとノーマルのマップをタイルする方が良いかどうか疑問に思っています。どちらが速いですか。シェイダーガイドのAppleのベストプラクティスは、テクスチャの修正が頂点シェーダで行われた場合、依存テクスチャの読み込みではないことを意味します。私はiphone4のレンダリングが高速化するかどうかを調べるつもりです。多分別のマップを試してみてください。 – badweasel

関連する問題