ドローコールの方がポリゴン数よりもパフォーマンスに大きな影響を与えがちです。最適化のためにはドローコールの理解が欠かせません。
ドローコールとは?
UE4的な定義:同じマテリアル(プロパティ)を共有するポリゴンのグループ。
上の定義からも分かるようにドローコールの数とメッシュの数は別です。ブループリントのコンポーネントなどもドローコールのひとつです。また、空のプロジェクトでも初期設定としてドローコールは存在します。
下の四角形の例をみてみましょう。同じメッシュを使っていますが、左はマテリアルが2つ、右はマテリアルが1つです。この場合、左はドローコールが2つ、右はドローコールが1つになります。
どのくらいが理想?
どのあたりから問題が発生するかは一概には言えません。ドローコールだけがパフォーマンスを決めるわけではないので、さまざまな要素を考慮する必要があります。以下はだいたいの数字で、どのようなゲームを作っているのかによって変わります。
› PC・コンソルゲーム
- 2000から3000までが理想
- 5000を超えると重たくなりがち
- 10000を超えると問題になりがち
› モバイルゲーム・VR
- 数百が最大
確認方法
› コマンド ’stat RHI’
- mesh draw calls(メッシュによって生成されたドローコールの数)が確認できる。メッシュによって生成されたドローコールの数を示す。
› コマンド ’stat sceneRendering’
- draw primitive calls(ポストプロセスなどを含めたすべてのドローコールの合計数)が確認できる。
› コマンドの出し方
- ’Tab’ か’Tilde (~)’を押してからコマンドの入力をする
› コマンドの消し方
- 同じコマンドを再度入力をするか、’stat none’を入力する
なぜドローコールは少ない方がいいのか?
ドローコールがどう処理されるかに関わっています。ひとつのドローコールにつきN個のトライアングルがGPUに送られ、同じレンダリングの条件がこのトライアングルに適用されます。たとえば同じ数のトライアングルをがあったとしても、100個のトライアングルを1000回送るよりも、1,000,000個のトライアングルを1回送る方が早いため、ドローコールは少ない方がパフォーマンスに効果があるのです。なぜなら、1回送るごとにGPUは止まって、CPUから次の転送を待つ必要があるからです。
もっと簡単に言うと、銀行に10,000円があって、それを家に持ち帰りたいとします。
家から銀行に行って一気に10,000円をおろしてくるのと、10円ごと何回もおろして10,000円になるまで家と銀行を何回も行き来するのとでは、圧倒的に1回で済んだ方が早いですよね。
銀行の例え、とても的確だと思います