トップ 一覧 検索 ヘルプ RSS ログイン

unity_opti_drawcallの変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!!!描画のためのDraw Call

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

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

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

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

以下は木を表現する例です(作業画面はShadeですが、これをfbx経由でUnityにインポートするものと考えてください)。
{{ref_image shade_tree_texture.png}}
{{ref_image shade_tree_texture_02.png}}
この場合は、木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がうまく最適化してくれます。
{{ref_image unity_opti_drawcall_2.png}}

ただ、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を使ったニセ影|unity_projector_shadow]]」でも書いていますが、ProjectorはDraw Callを多く消費します。

!!TerrainはDraw Callを消費する

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

----
{{lastmodified}}