ユーザ用ツール

サイト用ツール


opengl:optimize

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
opengl:optimize [2014/04/17 14:04] – [GPU 負荷] ogaopengl:optimize [2014/04/20 04:32] (現在) – [Alpha Test (discard) の是非] oga
行 78: 行 78:
 というのも、CPU でレンダリングしていた時代はもちろん、またはコンシューマゲーム機などのゲーム専用ハードでは、 というのも、CPU でレンダリングしていた時代はもちろん、またはコンシューマゲーム機などのゲーム専用ハードでは、
 Draw API ボトルネックがほとんど存在していなかったからです。 Draw API ボトルネックがほとんど存在していなかったからです。
 +
 GPU の種類が固定のゲーム専用機では、さまざまな GPU を想定する必要がありません。 GPU の種類が固定のゲーム専用機では、さまざまな GPU を想定する必要がありません。
 ステート記録時に GPU に適した形に変換してしまうことが可能で、 ステート記録時に GPU に適した形に変換してしまうことが可能で、
 描画時のステート切り替えも PC と比べると非常に低コストで実現できます。 描画時のステート切り替えも PC と比べると非常に低コストで実現できます。
 +それどころか、データを出力する時点で GPU Native な Command に事前変換することも可能でよく用いられます。
 +ほぼストリームのように、ロードしたあとは GPU に流しこむだけで描画できるわけです。
  
 +PC/Smartphone/Tablet のような汎用 OS の上では、
 最適化のためには、Draw Call 回数をできるだけ減らすことが重要となります。 最適化のためには、Draw Call 回数をできるだけ減らすことが重要となります。
 一度の Draw Call で出来るだけ多くの描画を行えば効率が上がることがわかっているので、 一度の Draw Call で出来るだけ多くの描画を行えば効率が上がることがわかっているので、
行 128: 行 132:
 ==== 演算精度 ==== ==== 演算精度 ====
  
 +OpenGL ES のシェーダープログラムでは、precision 宣言が可能です。
 +用途に応じて演算精度を適切に変えることができます。
  
 +演算精度を下げる事による主なメリットは 2点。ただし GPU によって異なります。
  
-==== Alpha Test (discard) 是非 ====+  * ALU 演算能力が増える 
 +  * レジスタの消費を抑えることでスレッド並列度が上がる
  
 +GPU のシェーダー演算能力には限りがあります。
 +ピーク性能は ALU の演算 Unit x 動作クロックで求まるので、この範囲でシェーダーの設計をしなければなりません。
  
-新しい GPU では、Alpha Test (discard) はパフォマンス低下招く要因である言われています。 +一部の Mobile 向け GPU では、演算精度を下げることによりトタル演算能力増やすこができます。 
-般的は Eary Z culling を阻害するためで、 +CPU で言えば SSE 等 SIMD 命令と同じで、倍精度 (64bit fp) なら 128bit ALU でに 2演算すが、 
-Face の Pixel に穴が開くとプリミティブ位の代表 Z 値を使うことができなります。+精度 (32bit fp) ら 4演算が可能になります。
  
-特に PowerVR などの Deferred Rendering (TBDR) と相性が悪く、ハードウエアの利点をスポイルしてしまことなります。 +同じように GPU って 
-PowerVR は先に Depth Buffer を生成して隠面除去を行ってから表面の必要なピクセルに対してのみ Pixel Shader (Fragment Shaderを走らせま。 +highp (32bit fpでは 1演算でが、mediump 宣言を行うと SIMD 同時に 2演算 (16bit fp) るものがります。 
-ちょうど Desktop GPU の Deferred Lighting 、ハードウエアが自動的にってくれるわけす。 +lowp (10bit fixed) も同様です。
-もし Shader に discard 命令が含まれており、途中で pixel を捨て可能性があるならば Pixel Shader を実行してみないと Depth Buffer が正しいものにならないことわかります。+
  
 +演算精度を下げることで、シェーダーの実行パフォーマンスが向上する GPU としては
 +PowerVR SGX, Tegra 2/3/4, Mali-400MP があります。
  
-ところ古い GPU アーキテチャでは、discard (texkill) よって早いタイミングで Pixel Shader を終了させることによ、 +特に PowerVR SGX は ALU の演算能力ボトルネックにりやく、精度指定によるシェーダーサイクル削減が全体の描画速度に如に現れます。 
-無駄な Texture Fetch 演算を省ことが可能です。 +Tegra や Mali-400 の場合はテンポラリレジスタの削減効果だ思われます。
-Tegra 2/3/4 の ULP GeForce は G70 世代の古い GPU core なので使用した方がシェーダーの実行効率を上げることができると言わています。 +
-例えば半透明描画時に Alpha 値が 0 ならば、カラーを出力しないで discard (texkill) してピクセルを捨てができます。+
  
-ただし他の GPU との互換性や今後のことを考え使良い思われます。+ただし演算精度を下げることでクオリティも下がのでシェーダー最適化時には用途に合せた細かチューニング必要なります。
  
 +逆に Adreno は Desktop GPU と同じで常に highp (32bit fp) 演算が用いられており、
 +演算精度を指定しても変化がありません。
  
  
行 158: 行 169:
  
  
 +
 +
 +
 +
 +
 +
 +==== Alpha Test (discard) の是非 ====
 +
 +新しい GPU では、Alpha Test (discard) はパフォーマンスの低下を招く要因であると言われています。
 +
 +例えば PowerVR などの Deferred Rendering (TBDR) との相性が悪くなります。
 +PowerVR は先に Depth Buffer を生成しておき、表面の必要なピクセルに対してのみ Pixel Shader (Fragment Shader) を走らせます。
 +ポリゴンが重なってもシェーダー負荷が一定以上上がらないので、効率よい描画ができることが特徴です。
 +ちょうど Desktop GPU で用いられる Deferred Lighting を、ハードウエアが自動的に行ってくれていることになります。
 +ところが、もし Shader に discard 命令が含まれているなら、Shader を実行してみないと正しい Depth Buffer を得ることができません。
 +よってポリゴンの重なりを効率良く取り除くことができなくなります。
 +
 +古い GPU アーキテクチャにおいては必ずしも悪い面だけとは限りません。
 +discard (texkill) によって早いタイミングで Pixel Shader を終了させることにより、
 +後続のシェーダーの演算や無駄な Texture Fetch を省くことが可能になります。
 +Tegra 2/3/4 の ULP GeForce は G70 世代の古い GPU core なので、適切に discard (texkill) を使用した方がシェーダーの実行効率を上げることができると言われています。
 +例えば半透明描画時にテクスチャの Alpha 値が 0 とわかっているならば、カラーの演算結果は最終的に無駄になります。
 +カラーを出力しないで、テクスチャを読んだ直後に discard (texkill) してピクセルを捨てる方が都合が良いわけです。
 +
 +ただし他の GPU との互換性や今後のことを考えると、使わない方が良いと思われます。
 +
 +
 +==== Vertex Cache と Primitive Type ====
 +
 +
 + 
 +
 +==== Tile Base と Framebuffer ====
  
  
opengl/optimize.1397711082.txt.gz · 最終更新: 2014/04/17 14:04 by oga

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki