UnityのuGUIは何も考えずに使っていると後からパフォーマンスが悪くなって大きく修正する必要が出てきてしまいます。
この記事では、uGUIのパフォーマンスを低下させる主要な原因とその対策をまとめました。
Unity2018.3.9
フィルレート
フィルレートとは「どれだけ重ね描きされているか」を表す指標です。
いま二つのImageを普通に(デフォルトのシェーダで)描画する場合を考えます。
次にこれをピッタリ同じ位置に重ねてみます。
このとき赤いImageだけが描画されていますが、
実は青いImageの描画処理も行われています(半透明描画のため)。
つまりGUIが大量に重なっているとGPUにどんどん処理負荷がかかっていきます。
そしてこれは上図のように見た目上では気づきづらかったりします。
パフォーマンスが悪いときにCameraのGUI関連のカリングマスクのをOFFにした結果
FPSが上がる場合には、フィルレートが問題になっている可能性が高いです。
また、Unityエディタ上でどれだけ重ね描きされているかを確認することができます。
方法としては対象のシーンでSceneビューをOverdrawモードに切り替えるだけです。
試しにParticleSystemを使って大量のメッシュを描画してみます。
描画がされるたびに薄いオレンジ色が加算されていきます。 つまり重ね描きされすぎてSceneビューが真っ白に見えていたら要注意です。
バッチ数(ドローコール数)
uGUIは描画をするときに同じアトラス&同じマテリアルのものをバッチングして描画します。
バッチングの詳細については下記の記事を参照してください。
バッチ数はGameビューのツールバーのStatsをクリックすることで見ることができます。
正確にはこの値はGUIだけのものではありませんが参考になるはずです。
さてこのバッチ数は違うテクスチャやマテリアルを使った描画が交互に行われる回数に応じて増えていきます。
例としてuGUIのButtonを下記のように並べてみます。
この場合、二つのボタンのImageがバッチングされ、またText同士もバッチングされるのでバッチ数は2です。
ここでこの二つのButtonを半分重ねてみます。
するとバッチ数が4に増えてしまいます。
これはButtonを重ね合わせたせいでImageとTextを交互に描画せざるを得なくなり、
そしてそれらが使うテクスチャは別のものなのでバッチングが効かなくなったためです。
バッチ数を減らすためにはこのような状況を防ぐことが重要です。
GraphicのリビルドとLayoutのリビルド
何かの一覧表示画面やアニメーションする要素がある画面で問題になりやすいのがリビルドです。
これにはGraphicのリビルドとLayoutのリビルドがありますが、複雑なので詳細は別記事にまとめています。
対応策だけ転載すると、
となります。