トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン

unity_opti_drawcall

描画のためのDraw Call


描画の最適化の目安として「Draw Call」があります。
これは、実行時のStatsをOnにすると表示される「Statistics」ウィンドウで確認できます。
これが大きな値だと全体的に重くなります。


Draw Callを消費する箇所はさまざまですが、マテリアル(テクスチャ)をたくさん使うとGL描画の処理がその都度行われるからか増えていくようです。
Draw Callを極力抑えるための手段など列挙します。

 Meshは極力1マテリアル/1テクスチャの使用にとどめる


fbxでインポートした形状は、1Meshに対して1マテリアル(1テクスチャ)になるようにします。複数のMeshで同一マテリアルを参照しているものは1つにまとめるのがよいかと思います。
また、可能であれば同一Shaderを使用してテクスチャが異なる、といった場合は1つのテクスチャに複数をまとめてしまう(Atlas化)するほうがDraw Callを節約できます。

以下は木を表現する例です(作業画面はShadeですが、これをfbx経由でUnityにインポートするものと考えてください)。

この場合は、木1本で1マテリアル/テクスチャしか使わないような表現を行っています。
これで、木1本に対してDraw Callは1つで済みます。
このように、複数の要素を1枚のテクスチャに納めるのを「Atlas化する」と呼んでいます(Unity/NGUI用語かも)。
また、最終的にfbxファイルを出力する際はすべてのポリゴンメッシュを1つに結合して出すようにします。

 GameObjectのTransformのScaleは1にする


GameObjectで同一形状を複数配置する場合、Unityの実行前に最適化されるからかDraw Callが個数倍になることはないです。
が、TransformのScaleを変更すると法則は分かりませんがDraw Callは増加しました。
TransformのScaleは(1, 1, 1)固定にするほうがよさそうです。

 動かないGameObjectはStaticに


シーンに配置したGameObjectで不動の静止形状の場合は、StaticをOnにするとUnityがうまく最適化してくれます。


ただ、1つの形状に複数のメッシュ/マテリアルを割り当てている場合は、形状を複数配置してStaticをOnにしてもDraw Callは形状数分消費するようでした。

 見えない形状はDraw Callを削減してくれる


ビューから形状が見えていない場合は描画自身されないからか、Draw Callは削減できているようでした。

 Shadow mapはDraw Callを消費する


Directional Lightなどの光源でのShadow mapは、同一形状であってもstaticであってもDraw Callを最低1つは消費するようです。
形状がたくさんある場合は不利。

1Meshにニセ影の面を配置して、1つの半透明マテリアルを割り当てる、とするほうが節約できます。
形状も光源も動かない場合は、lightmapの焼付けを使うのもいいかもしれません。

 ProjectorはDraw Callを消費する


Projectorを使ったニセ影」でも書いていますが、ProjectorはDraw Callを多く消費します。

 TerrainはDraw Callを消費する


TerrainはDraw Callを多く消費します。
特に木を配置してズームした場合にはあっという間に増加します。


最終更新時間:2014年03月07日 17時34分05秒