原因は単純だったけど解決したのでメモ。
環境
・Mac・Unity 4.2.2.f1
・NGUI 3.0.3g
つまづいたこと
NGUIでUIを大量に配置してたらDrawCallが30超えた。同じUIAtlas使ってるしDepthも揃えたのになんでだろなーって思ってた。
原因
同じUIAtlasを使っていてもUIPanelを複数配置するとDrawCallが別れるんですね。以前どこかで「まとめて動かすようなものはPanelに入れる」って読んだ気がしてUIPanel量産してましたw
ダメなパターン
Root(UIRoot)┗Camera(Camera,UICamera)
┗Anchor(UIAnchor)
┗Panel(UIPanel)
┣Panel1(UIPanel) ←まとめて動かす用
┃ ┗Sprite(UISprite)
┗Panel2(UIPanel) ←まとめて動かす用
┗Sprite(UISprite)
2つのSpriteはどちらも同じAtlasを参照してますけどDrawCallは2ですね。
Panel1のInspector見てみてもDrawCallが別れてるのが分かります。
対応
じゃあどうするか?UIPanelを1つだけにすればいいんです。
Panel1,Panel2からUIPanelコンポーネントをむしり取りましょう。
大丈夫なパターン
Root(UIRoot)
┗Camera(Camera,UICamera)
┗Anchor(UIAnchor)
┗Panel(UIPanel)
┣Panel1(空のGameObject) ←まとめて動かす用
┃ ┗Sprite(UISprite)
┗Panel2(空のGameObject) ←まとめて動かす用
┗Sprite(UISprite)
┗Camera(Camera,UICamera)
┗Anchor(UIAnchor)
┗Panel(UIPanel)
┣Panel1(空のGameObject) ←まとめて動かす用
┃ ┗Sprite(UISprite)
┗Panel2(空のGameObject) ←まとめて動かす用
┗Sprite(UISprite)
これだけでDrawCallは1つになりました。
DrawCallは親Panelに集約されてますね。
Panel1,2は空のGameObjectになってしまったけど何の問題もなさそうです。
まとめ
DrawCallをとにかく減らしたいなら1つのUIPanelに配置する。
でも同時に表示しないUI(ゲーム画面用、ポーズ画面用など)はこだわる必要ないので別々のUIPanelにした方が楽に扱えそうですね。
疑問
DrawCallが増えてでもUIPanelを別けたい場合はあるだろうか?
パーティクル表示を(Atlas、Panelセットで)分離したいときとか?
参考
ここでは別Panelでも1Callだったって書いてあるけど仕様変わったのかな。
最初読んだとき良くわからなかったけど今じっくり読んでやっと分かった。やったこと同じだね。
楽しいUnityライフを!