opengl:optimize
差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン次のリビジョン両方とも次のリビジョン | ||
opengl:optimize [2014/04/17 14:27] – [演算精度] oga | opengl:optimize [2014/04/18 21:28] – [Vertex Cache と Primitive Type] oga | ||
---|---|---|---|
行 78: | 行 78: | ||
というのも、CPU でレンダリングしていた時代はもちろん、またはコンシューマゲーム機などのゲーム専用ハードでは、 | というのも、CPU でレンダリングしていた時代はもちろん、またはコンシューマゲーム機などのゲーム専用ハードでは、 | ||
Draw API ボトルネックがほとんど存在していなかったからです。 | Draw API ボトルネックがほとんど存在していなかったからです。 | ||
+ | |||
GPU の種類が固定のゲーム専用機では、さまざまな GPU を想定する必要がありません。 | GPU の種類が固定のゲーム専用機では、さまざまな GPU を想定する必要がありません。 | ||
ステート記録時に GPU に適した形に変換してしまうことが可能で、 | ステート記録時に GPU に適した形に変換してしまうことが可能で、 | ||
描画時のステート切り替えも PC と比べると非常に低コストで実現できます。 | 描画時のステート切り替えも PC と比べると非常に低コストで実現できます。 | ||
+ | それどころか、データを出力する時点で GPU Native な Command に事前変換することも可能でよく用いられます。 | ||
+ | ほぼストリームのように、ロードしたあとは GPU に流しこむだけで描画できるわけです。 | ||
+ | PC/ | ||
最適化のためには、Draw Call 回数をできるだけ減らすことが重要となります。 | 最適化のためには、Draw Call 回数をできるだけ減らすことが重要となります。 | ||
一度の Draw Call で出来るだけ多くの描画を行えば効率が上がることがわかっているので、 | 一度の Draw Call で出来るだけ多くの描画を行えば効率が上がることがわかっているので、 | ||
行 139: | 行 143: | ||
ピーク性能は ALU の演算 Unit x 動作クロックで求まるので、この範囲でシェーダーの設計をしなければなりません。 | ピーク性能は ALU の演算 Unit x 動作クロックで求まるので、この範囲でシェーダーの設計をしなければなりません。 | ||
- | 一部の Mobile 向け GPU では、演算精度を下げることによりトータルの演算回数を増やすことができます。 | + | 一部の Mobile 向け GPU では、演算精度を下げることによりトータルの演算能力を増やすことができます。 |
CPU で言えば SSE 等 SIMD 命令と同じで、倍精度 (64bit fp) なら 128bit ALU で一度に 2演算ですが、 | CPU で言えば SSE 等 SIMD 命令と同じで、倍精度 (64bit fp) なら 128bit ALU で一度に 2演算ですが、 | ||
単精度 (32bit fp) なら 4演算が可能になります。 | 単精度 (32bit fp) なら 4演算が可能になります。 | ||
行 145: | 行 149: | ||
同じように GPU によっては、 | 同じように GPU によっては、 | ||
highp (32bit fp) では 1演算ですが、mediump 宣言を行うと SIMD で同時に 2演算 (16bit fp) できるものがあります。 | highp (32bit fp) では 1演算ですが、mediump 宣言を行うと SIMD で同時に 2演算 (16bit fp) できるものがあります。 | ||
- | lowp (10bit fixed) | + | lowp (10bit fixed) も同様です。 |
- | 演算精度を下げることで、シェーダーの演算パフォーマンスが向上する GPU としては | + | 演算精度を下げることで、シェーダーの実行パフォーマンスが向上する GPU としては |
PowerVR SGX, Tegra 2/3/4, Mali-400MP があります。 | PowerVR SGX, Tegra 2/3/4, Mali-400MP があります。 | ||
- | 特に PowerVR SGX は精度指定によるシェーダーサイクルの削減が全体の描画速度に如実に現れます。 | + | 特に PowerVR SGX は ALU の演算能力がボトルネックになりやすく、精度指定によるシェーダーサイクルの削減が全体の描画速度に如実に現れます。 |
- | シェーダー演算以外のオーバーヘッドが少ないためと考えられます。 | + | Tegra や Mali-400 の場合はテンポラリレジスタの削減による効果だと思われます。 |
- | Tegra や Mali-400MP ではテンポラリレジスタの削減による効果だと思われます。 | + | |
ただし演算精度を下げることでクオリティも下がるので、シェーダー最適化時には用途に合わせた細かいチューニングが必要となります。 | ただし演算精度を下げることでクオリティも下がるので、シェーダー最適化時には用途に合わせた細かいチューニングが必要となります。 | ||
逆に Adreno は Desktop GPU と同じで常に highp (32bit fp) 演算が用いられており、 | 逆に Adreno は Desktop GPU と同じで常に highp (32bit fp) 演算が用いられており、 | ||
- | 演算精度を指定しても全く変化がありません。 | + | 演算精度を指定しても変化がありません。 |
行 194: | 行 197: | ||
+ | ==== Vertex Cache と Primitive Type ==== | ||
+ | |||
- | + | ==== Tile Base と Framebuffer ==== | |
- | + | ||
opengl/optimize.txt · 最終更新: 2014/04/20 04:32 by oga