OpenGLES高速化

たいした処理もしていないのに結構速度が出ない日々が続いていたので
色々と修正して速度の向上を図りました。


基本的にはネットで調べて大体の高速化を試してみた。


・よく書かれていたこと
 レンダリングステート系の重複処理を無くす。
 DrawElements系の描画メソッドの呼び出し回数を減らす。
 圧縮テクスチャを使用する(ビデオメモリ上にテクスチャを配置する)。


とりあえず上記3つを試してみた。

レンダリングステート系は管理クラスを作って変更があった時だけ切り替えるような物を作成。
DrawElements回数は2Dで大量に呼び出していたのでテクスチャ毎に頂点をまとめて一括表示する様な物を作成。

確かに速度は上がったが、何かがやっぱりおかしい
なんというか描画時に一瞬カクつく!!!

なんでだろうと更に調べていると、
頂点データサイズを減らすとデータの転送速度が上がるということでこれを試してみた。


従来の頂点データだと座標、法線、UV、頂点カラーなどを全てfloatで宣言していたのだが、これをなるべく軽いデータ

座標、法線を[short int]
UV、頂点カラーを[unsigned char]
にそれぞれ変更してみた。

1頂点あたりデータ量的には
float pos[3]; // 4*3
float normal[3]; // 4*3
float uv[2]; // 4*2

の32バイトだったのが、

short int pos[3]; // 2*3
short int normal[3]; // 2*3
unsigned char uv[2]; // 1*2

の14バイトに減った。


これがドンピシャで転送負荷が軽くなって描画時、バインド時にカクカクしてたのが改善されてスムーズに動く様に。


ただ浮動小数点を使わなくした分、データを変換する計算は増える。
UVの場合、0~255の値を0~1の範囲内にシェーダー上で変換してやらないといけない。

変換計算は頂点シェーダーの場合は命令負荷が比較的軽いので良いが、
これがピクセルシェーダーになると乗算1回でも悲鳴を上げたくなるほど激重になるので注意。

しかし相変わらず全体を覆うような物でアルファブレンドを使用するとめちゃくちゃ重い。こればかりはなんとかしてアルファブレンドを使用する物を減らすしか無さそうだ・・・