おもちゃラボ

Unityで遊びを作ってます

Unityでドローコール(Set pass call)を減らす方法まとめ

ゲームのFPSに大きなインパクトを与える要因としてドローコール(Unity5ではSet Pass Call)があります。これは1フレーム描画するのに、CPUからGPUに対して何回描画命令を送っているかを示す値です。

描画命令にはそれなりの時間がかかるので、Set Pass Call数が少なければ少ないほど高いFPSを維持することができます。 大まかな目安としてはスマートフォンで100程度といわれています。

Set Pass Call数を減らす方法としては、主に次のもの考えられます。ここではそれぞれにの方法について紹介します。

影を描画しない

Unityではライトで照らされるオブジェクトには自動的に影がつきます。この影を描画するのにもSet Pass Callを消費します。そこで影を消すだけでSet Pass Callは減少します。

f:id:nn_hokuson:20170206205318p:plain

それでも影がつけたい、という人はライトを焼き(ベイク)ましょう。ライトのベイクとは、実行時にリアルタイムで影の計算をするのではなく、ゲーム作成時に影の形をテクスチャに描いておく方法です。これにより、実行時に影を表示するための計算を省略できるので、Set Pass Call数が下がります。

staticバッチングをする

動かないオブジェクトはstaticにチェックを入れておきましょう。staticにチェックが入っていて同じマテリアルを使っているオブジェクトは1回のドローコールで描画することができます。

f:id:nn_hokuson:20170206205604p:plain

staticにしたいオブジェクトは、個別にチェックを入れても良いですが、少々めんどくさいですね。そこで、staticに指定したオブジェクトを空のゲームオブジェクトの子要素にします。空のゲームオブジェクトのstaticにチェックを入れるだけで、全ての子要素に対してstaticを適用することができます。

f:id:nn_hokuson:20170206213637p:plain

複数マテリアルを1つのテクスチャにまとめる

Set Pass Callはマテリアルの数に比例して値が大きくなります。つまり、マテリアル数が少なければ少ないほど、Set Pass Callも少なくなります。逆にマテリアルが同一であれば、Set Pass Callは増えません。

例えば次の木のモデルの場合、それぞれの葉に別マテリアルをアタッチしているため、Set Pass Callは23になっています。これを一つのテクスチャにまとめると1つのマテリアルで済むのでSet Pass Callは14になります。

f:id:nn_hokuson:20170206221216p:plain:w500

テクスチャアトラスを作る

使用するスプライトを一つのテクスチャにまとめた「テクスチャアトラス」を使うことでSet Pass Call数を減らすことができます。これは木のマテリアルを一つのテクスチャにまとめるのと同じ理由です。つまり、一つのマテリアルの画像を使い回せば、画面上に複数のスプライトがあっても、1回のドローコールで描画できます。

f:id:nn_hokuson:20170206214202p:plain:w350

使用するスプライトを一つのテクスチャにまとめるにはUnityが提供しているSprite Packerを使うと便利です。

docs.unity3d.com

メッシュの結合

Unityにはdynamic batchingという機能があります。これはゲーム実行時に同一のマテリアルを使用しているオブジェクトをバッチして(結合して)一回のドローコールで描画する機能です。ただしdynamic batchingを使うには、かなり厳しい制限があるため、なかなか使いにくいのが実情です。

ドローコールバッチング - Unity マニュアル

そこで、手動でバッチを行うツールを使って、自分でメッシュの結合を行います。メッシュの結合を行える有名なツールには「Mesh Baker」があります。

f:id:nn_hokuson:20170206214430p:plain

カメラのEffectをはずす

Standard Assetに付属するポストエフェクトは見栄えが良くなりますが、そのぶんSet Pass Callも増えます。特に「SSAO」や「Depth of Field」、「Tilt Shift」はSet Pass Callが増えやすいので注意が必要です。

f:id:nn_hokuson:20170206215659g:plain

まとめ

Unityの処理の重さの指標の一つとしてSet Pass Callを減らす方法を紹介しました。常に処理の重さとドローコールの回数が比例するわけではありませんが、思わぬトラブルを避けるためにもSet Pass Callは意識しながら開発しましょう。