Point

ドローコールの方がポリゴン数よりもパフォーマンスに大きな影響を与えがちです。最適化のためにはドローコールの理解が欠かせません。

ドローコールとは?

UE4的な定義:同じマテリアル(プロパティ)を共有するポリゴンのグループ。

上の定義からも分かるようにドローコールの数とメッシュの数は別です。ブループリントのコンポーネントなどもドローコールのひとつです。また、空のプロジェクトでも初期設定としてドローコールは存在します。

下の四角形の例をみてみましょう。同じメッシュを使っていますが、左はマテリアルが2つ、右はマテリアルが1つです。この場合、左はドローコールが2つ、右はドローコールが1つになります。

Drawcalls

どのくらいが理想?

どのあたりから問題が発生するかは一概には言えません。ドローコールだけがパフォーマンスを決めるわけではないので、さまざまな要素を考慮する必要があります。以下はだいたいの数字で、どのようなゲームを作っているのかによって変わります。

› 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回で済んだ方が早いですよね。