描画のための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秒