TuningWebGLコンテンツ/プログラムの速度をコツコツと速くするための、パフォーマンスチューニング観点をまとめました。プロファイリングが重要。闇雲にチューニングしても、あまり速くならない場合もあります。最初の設計や、ハードウェア性能を知った上でのデータ量の見積もりも重要です。■WebGLプロファイリングのコツ●グラフィックスパイプラインを理解し、どこに時間がかかるか、どこがボトルネックか見極める。●画面サイズを1/2や1/4にして確かめる(GPU性能か、それ以外が原因か解る)●目的のハードウェアがどれくらいの数、物量の描画が描けるのか単純なサンプルで限界を測定する。WebGLが遅い部分を切り分ける■WebGL高速化のコツ:ハードウェアの仕組みを理解して性能をあげる●CPU-GPU間のやり取りを最小に。事前に計算できることは、できるだけ前処理で計算しておく。GPU側にデータを送り込むような場合は、できるだけまとめて一気に。しておき、切り替えるだけでも高速。使うたびに毎回読み込んだりするのは極端に効率が落ちる。むやみに減らすのではなくクオリティとのバランス。減らすとどれくらい速くなるのかを把握しつつ。●ポリゴンの描き方、描き順を、グラフィックスハードウェアに最適化する。三角形よりも、四角形が速い環境、または逆の環境もある。頂点座標の扱いはできるだけまとめてしまう。デフォルト値が設定されていないとか、範囲外の値を設定したとか、エラーを皆無にすることで、引っかかりを無くすことができる場合もある。コンフォーマンステストで使えない命令、曖昧な命令を見つけておき、避けるようにする。●シェーダーはできるだけ分岐判断させない。分岐判断はできるだけ最後に計算速度の速いシェーダーで代替できないか考える。計算式によるが、単純に短いと速い。シェーダーの動的コンパイルの時間もあるので、使い回せると速い(と思う。●ターゲットとなるハードウェアを確認し、EXT命令で活用できるものを探す。高速化のための拡張命令は積極的に使う。●GL系、画面データを読み取るのは時間がかかる。系の命令を使うのを控える。ループ外で一気に使うようにする。ループ内で使うと読むのと書くのと、コンテキストスイッチの切り替えに時間がかかる。●設定しなくて良いものは、デフォルト値を使う。何がデフォルト値なのは、決まっているが、まれに初期値が不定なことが仕様の値もあるので注意。●目標のフレームレートが決まれば、その1フレーム内でどれだけの計算や描画が行えるか計算し、その秒数内で様々な事象が完結するようにする。使うよりは、動作速度は遅くなる。フレームワーク内部の計算部分など、速度に関するオーバーヘッドもあるので注意して使う。●テクスチャサイズはクオリティが許せるまで極限まで小さく。画面で見ているクオリティと、3D画面内のどこかで使っているテクスチャはそれほど高解像度で無くとも十分な場合がある。●テクスチャの種類によっては、極限まで圧縮されたJPEGファイルを展開するCPU負荷よりも、BMPファイルをそのまま使う方が早かったりする場合もある。