2018/12/05

そもそもどうやって描画されているのか
UnityはMeshで描画される
Material Textureなど
筆がないと絵がかけないようなもの
筆を持ち替える行為→動作が遅くなる原因
ドローコールなどに影響してくる
この極力筆を持ち替えないように描画をまとめることをBatching(バッチング)するという
同じMesh内にはいっていれば1batchだけど途中で違う要素が挟まると3batchに分割される
これをbatchが壊れる 破れるという
ステートの変更
テクスチャが違ってマテリアルが同じ→そんなに描画は遅くならない
テクスチャが違ってマテリアルが違う→かなり遅くなる
シェーダーを変えないといけないためかなり描画が遅くなる
このイケてない状態をSetPassコール(遅い描画のこと)という
Staticsの中にStateとSetpassは表示される
SetPassはできるだけ少ないことが望ましい
BatchingをUIに応用するとどうなるか?
見た目はまったく同じでドローコールが変わるやりかた(=すべてBatchingされている状態)を目指す
Unity5 Flame Debbuger
Window>FlameDebbuger
ドローコールごとに何がレンダリングされているかわかるようになる
1ドローコールごとになにが描画されているのかわかるようになっている。
イケてないUIの配置方法だと一撃でバレる仕組みだ…!)
RULE#1
同じマテリアルテクスチャの場合
色をColorContで変える>OK
重なっていてもOK
RULE#2
バッチが切れるタイミングはマテリアルやテクスチャを変更した時
重複している場合間に挟まっている画像のマテリアルが違う場合バッチが切れることがある(=3ドローコール)
この切れる箇所を減らしたい
Unityが5.1からBatchingを自動で綺麗にするようにした
5.2から同じCanvas上のものはバッチングされるようになる
Add Conpornentすると同じドローコールとみなされる仕様に。ええやん。
これはもうuGUI一択では)
・マテリアルを変えるときにはバッチが壊れる
・テクスチャを変えるときにはバッチが切れる
・エレメントがキャンバスから離れる場合はソーティングが切られる
ドローコールを少なくするコツ
・マテリアル変更は最小限に
・5.2からUIとLabelが同じマテリアルとして扱えるようになった
・テクスチャ単品の変更を避けるAtlasにまとめよう
ここからデモ
初期に25ドローコール使っている画面をバッチングしていく
1.ヒエラルキーでCanvasと同一平面に入れるようにする
要素はネストする
コンポーネントからCanvas要素にネストする
これで25>13に
さらにその子要素にもCanvasにネストする
2.シングルテクスチャからスプライトアトラスにする
最終的にドローコールを25→4に減らすことができた
CanvasRedeller
UIはすべてCanvasRedellerをもっている
Texture Mesh Colorを情報としてもっている
プロパティを変更する(画像を途中で差し替えたら)とどうなるのか?
>Rebatchingが起こる
遅くはないが速くもないのでこれは避けた方がいい
階層の順番がかわってしまうことがある
ネストがかわることがある
PIXCEL PERFEXTモード
ピクセルにスナップされるモード
親要素がスナップされると子要素もスナップされる
→頂点設定がかかわっているので遅くなる
移動するオブジェクトに使うには避けた方がいい
あまり使わない方がいい
——このへんからエンジニア向け
CUSTOM UI CONPORNENT
UIコンポーネントをカスタマイズできる
見た目もガンガン変えられる
CANVAS ELEMENT
スクリプトに書く キャンバスの描画の順番を指定できる
特殊な普段通りの描画以外の場合に指定する
まとめ
最適化することでよりはやくUIをレンダリングできるようになるよ
この講演が一番この情報はやく知れてよかったな〜感ある
Canvas超重要要素になるわこれ…)