【Unity】uGUIのパフォーマンスを低下させる主要な原因と解決方法を全てまとめてみた

UnityのuGUIは何も考えずに使っていると後からパフォーマンスが悪くなって大きく修正する必要が出てきてしまいます。
この記事では、uGUIのパフォーマンスを低下させる主要な原因とその対策をまとめました。

Unity2018.3.9

フィルレート

フィルレートとは「どれだけ重ね描きされているか」を表す指標です。
いま二つのImageを普通に(デフォルトのシェーダで)描画する場合を考えます。

f:id:halya_11:20190323235418p:plain

次にこれをピッタリ同じ位置に重ねてみます。

f:id:halya_11:20190323235630p:plain

このとき赤いImageだけが描画されていますが、
実は青いImageの描画処理も行われています(半透明描画のため)。

つまりGUIが大量に重なっているとGPUにどんどん処理負荷がかかっていきます。
そしてこれは上図のように見た目上では気づきづらかったりします。

パフォーマンスが悪いときにCameraのGUI関連のカリングマスクのをOFFにした結果
FPSが上がる場合には、フィルレートが問題になっている可能性が高いです。

また、Unityエディタ上でどれだけ重ね描きされているかを確認することができます。
方法としては対象のシーンでSceneビューをOverdrawモードに切り替えるだけです。

f:id:halya_11:20190323235936p:plain

試しにParticleSystemを使って大量のメッシュを描画してみます。

f:id:halya_11:20190324004658p:plain

描画がされるたびに薄いオレンジ色が加算されていきます。 つまり重ね描きされすぎてSceneビューが真っ白に見えていたら要注意です。

バッチ数(ドローコール数)

uGUIは描画をするときに同じアトラス&同じマテリアルのものをバッチングして描画します。
バッチングの詳細については下記の記事を参照してください。

light11.hatenadiary.com

バッチ数はGameビューのツールバーのStatsをクリックすることで見ることができます。
正確にはこの値はGUIだけのものではありませんが参考になるはずです。

f:id:halya_11:20190324005526p:plain

さてこのバッチ数は違うテクスチャやマテリアルを使った描画が交互に行われる回数に応じて増えていきます。

例としてuGUIのButtonを下記のように並べてみます。

f:id:halya_11:20190324011439p:plain

この場合、二つのボタンのImageがバッチングされ、またText同士もバッチングされるのでバッチ数は2です。
ここでこの二つのButtonを半分重ねてみます。

f:id:halya_11:20190324011549p:plain

するとバッチ数が4に増えてしまいます。
これはButtonを重ね合わせたせいでImageとTextを交互に描画せざるを得なくなり、
そしてそれらが使うテクスチャは別のものなのでバッチングが効かなくなったためです。

バッチ数を減らすためにはこのような状況を防ぐことが重要です。

GraphicのリビルドとLayoutのリビルド

何かの一覧表示画面やアニメーションする要素がある画面で問題になりやすいのがリビルドです。
これにはGraphicのリビルドとLayoutのリビルドがありますが、複雑なので詳細は別記事にまとめています。

light11.hatenadiary.com

対応策だけ転載すると、

  • できるだけGUIを動かさない
  • 頻繁に動くGraphicは小さいCanvasに切り出す
  • Layoutはできるだけ使わない
  • Layoutの影響下のUIを頻繁に動かさない

となります。

関連

light11.hatenadiary.com

light11.hatenadiary.com