えんじにあ雑記!

開発していて学んだことをまとめていきます!

uGUIのバッチ処理について

f:id:flat-M_M:20200407230824j:plain

ドローコール意識していますか?

UIも動けばいいだけじゃなくて、効率よく動くを目指してみましょう!

そこで今回はuGUIのバッチ処理についてまとめてみました!

uGUIのドローコール削減について

普段個人開発をしていると、UI部分での最適化はあまり意識していなかったな〜という思いから、UIの最適化について少しまとめてみようと思います。

今回は

SpriteAtlasを使って複数のSpriteを表示する際のドローコールを削減する方法

についての記事になります。

ドローコールとバッチ処理

ドローコールとは何かに関しては

DrawCallって何?描画パフォーマンスを考える一つの指標を見る

の記事に詳しく書かれているのでそちらを参照してください。

簡単に言ってしまうと描画のための情報をCPUからGPUに渡す処理になります。

UnityにおけるUIのバッチ処理とは、各UIをまとめて一つのドローコールで一斉に処理を行えるようにすることを指します。

バッチ処理の確認方法

一例として下記のような画面を構成します。

f:id:flat-M_M:20200228124053p:plain
作成した画面

三つのボタンが並んだだけのシンプルなUIですが、この画面を描画する際のバッチ処理を確認します。

バッチ処理を確認するためには、Window>Analysis>ProfilerからProfilerウィンドウを表示し、UIの部分を選択します。

f:id:flat-M_M:20200228124700p:plain
バッチ処理の確認

バッチ処理が行われているか、行われていない場合何が原因でバッチ処理できていないのかが分かります。

この場合はDifferent Texture(異なるテクスチャを参照しているから)と分かります。

また、余談ですがFrame Debuggerを用いることで描画の順序まで確認することができます。

f:id:flat-M_M:20200228124939g:plain
Frame Debuggerでの描画順の確認

バッチ処理の条件

では、ここからバッチ処理をできるようにしていきたいのですが、そもそもバッチ可能な条件には以下のものがあります。

f:id:flat-M_M:20200228125648j:plain
バッチ可能な条件

そして、今回の場合は

f:id:flat-M_M:20200228125742j:plain
バッチできていない原因

三つ目の同じTextureを参照しているの部分が満たせていないため、バッチ処理できていないということが分かります。

バッチ処理可能にする

異なるTextureを参照している場合、バッチ可能にするには一つにまとめる必要があります。

例えば、Spriteの場合はProject>Create>SpriteAtlasからSpriteAtlasを選択することで複数のSpriteを一つのSpriteにまとめたものが作成できます。

今回はSpriteAtlasの詳しい説明は内容と逸れるので省きますが、

Spriteをパックする新しい仕組み、SpriteAtlasを使ってみた【Unity】【SpriteAtlas】

こちらの記事に詳しく説明されていますのでそちらを参照ください。

確認

実際に、SpriteAtlasを用いるように修正したバージョンで、ドローコールを確認してみます。

f:id:flat-M_M:20200228130429p:plain
バッチ処理対応

Frame Debuggerでも確認してみます。

f:id:flat-M_M:20200228130531g:plain
FrameDebuggerで描画順を確認

最後に

今回はuGUIのバッチ処理についてまとめました。

以前、

C#でパフォーマンスの良いコードを書く

でパフォーマンスについて調査したのですが、ゲームだとリッチな画像なども多く使うのでUI部分の最適化も必要な知識だなと感じます。

また、色々な知見を得て、発信していければと思いますので、感想とか教えてもらえると嬉しいです🙇‍♂️