[Unity]最適化の要!「DrawCall」とは?

サムネイル
Pocket

Unityの処理速度を向上させるためには「DrawCallを減らす」ことが最も大切と言われます。

ですが、そもそもDrawCallってなんだろう?ということを解説している記事が少なかったので、簡単にまとめてみました。

どこから確認できるの?

サムネイル

GameビューのStatusをクリックすると、赤線の位置に表示されます。

 

 

簡単に解説

DrawCallとは、「描画が呼ばれた回数」です。

描画の際には以下の様な手順を踏みます。

1) CPUからGPUにテクスチャ、マテリアル、座標等の値を渡す
2) GPUを走らせ、ポリゴンをレンダリング
3) CPUに処理を戻す

DrawCall: 3なら3回、DrawCall: 100なら100回、これらのプロセスが行われていることになります。

CPUとGPUの間のやりとり、同期待ちにはかなりの時間がかかるので、「DrawCallは出来る限り減らしましょう」と言われるわけです。

 

DrawCallを減らす方法とは?

最近のGPUは、一度に複数のオブジェクトをレンダリングするための「ハードウェアインスタンシング」(バッチングともいう)という機能をサポートしています。

シェーダーを使って自分でGPUの処理を書き、一度に複数のオブジェクトをレンダリングしてしまえば、何万個のオブジェクトを一度にレンダリングしても、1回のDrawCallで済むわけです。

ハードウェアインスタンシングについては以下の記事で詳しく解説しています。
[Unity]コンピュートシェーダ(GPGPU)で1万個のパーティクルを動かす | Puzzle & Programing

 

 

 

 

Unity標準のDrawCall削減機能

Unityには標準で、バッチングして、可能な限りDrawCallを削減する機能がついています。

下の画像では、32個ものGameObjectがあるにも関わらず、DrawCallはたったの3です。

 

サムネイル

 

違うマテリアルを含めたり、違う形状のメッシュを含めたりすると、バッチングができなくなり、DrawCallは増えてしまいます。

サムネイル

 

 

ShurikenパーティクルとSpriteシステム

また、ShurikenパーティクルやSpriteシステムでも、一つのテクスチャにまとまった画像(テクスチャアトラス)は自動でバッチングされるようになっています。

EDGE2

サムネイル

 

まとめ

DrawCallを少し意識するだけでも、かなりゲームの実行速度を上げることが出来ると思います。

単純に物量が沢山出せるようにもなるので、ぜひ気にしつつプログラミングしてみてください!

Pocket

Pingbacks/Trackbacks

  1. [Unity] 開発中にFPS維持できなくなって、原因よくわからないとき(超初学者向け) | KentaKomai Blog - 2016年3月26日

    […] notargs.com Unity 最適化の要!「DrawCall」とは? […]

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

(Required)

Proudly powered by WordPress   Premium Style Theme by www.gopiplus.com