ドローコールについて
Draw Call(ドローコール)という単語が日常的に出てくるようになりましたが、スミオ(@tempkinder)さんに色々と教えて頂いたのでメモがてらまとめておきたいと思います。
(ありがとうございますー!)
ドローコールとはその名の通り描画するための命令で、CPU負荷になる要因とのことです。
アーティストが知っておいた方が良いこと
非常にざっくりですが、アーティストが知っておいた方が良いと思うのは以下‥
●モデルについて
・画面内のモデル(メッシュオブジェクト)1つでドローコール1
・インスタンス化した場合、ドローコールは1に抑えられる
例えばDraw(AAA, BBB, 100)などで100回描画は一度で描画できる
しかし1つ1つがどこにあるか?などの情報が必要なため大抵メモリの削減に繋がらない
(このあたりはエンジニアによって意見が違うかも知れない‥とのことでした)
・複数のモデルを1つに結合することでドローコール削減になる
●マテリアルについて
・マテリアル1つでドローコール1
・UE4の複数のマテリアルインスタンスでswitchした場合は別シェーダーが走るのでドローコールが増える
・複数のマテリアルを1つに統合することでドローコール削減になる
●テクスチャについて
・テクスチャ1枚でドローコール1
・複数のテクスチャを1枚に統合することでドローコール削減になる
●エフェクトについて
・1つのエミッターでドローコール1、とかだったりするらしい
ドローコールについてその他いろいろ
その他にもドローコールについて注意点を色々と伺いました。
●全体的なこと
・ドローコール数が多い=重い‥とは限らないので注意が必要
・ドローコール数の対策には色々なテクニックがあるがエンジンによるのでなんとも言えない
・例えばシーンを覆う沢山の草を1回のドローにまとめたとすると、描画範囲外の草までGPUに投入してしまったりする
・逆に見える範囲だけを調べてそれらを1つにまとめて1ドローに‥とできれば良いが、調べるコストによってドローコール減らす意味がなくなったりする
・ドローコール数を制限するなら、1フレーム内の想定できるワーストケースと平均を見比べて、基準を満たしているかを計るのが一般的
・派手なエフェクト一瞬だけ処理落ちするのを許容するようなタイトルはよくある
・ただ、コンシューマ機の場合ドローコールはそれほどネックにならず、特にUE4の場合はPCの方が過剰にネックになっている可能性があるので注意が必要
●Parallel Rendering
・ドローコールが負荷に見える場合でも、実はドローコール前の様々な計算が負荷になっていることがよくある
そういった場合のためにUE4ではParallel Renderingという機能が用意されている
・ドローコール前の計算を複数のCPUコアに分散させて計算して処理速度を軽減する
・また、この機能は現時点ではドローコールは分散してくれないので、その点はあまり期待できなかったりする
・UE4の4.7ではデフォルトでONになっている
●エフェクトについて
・UE4ではGPUパーティクルの負荷は少ないので、GPUパーティクルは率先して使った方が良いと思う
そうするとパーティクルに使えなくなる機能が増えるが‥
・エフェクトの場合はドローコールでCPU負荷が高まり、半透明のオーバードローでGPU負荷が高まるという感じだが、ここらへんになるともうエンジニアの仕事なので任せてしまった方が良いと思う
●テクスチャについて
・テクスチャに関しても、テクスチャがネックになっているかどうかの精査が必要で難しい
・大抵の場合、テクスチャがネックかどうかはUE4のプロファイラレベルでは見えず、GPU内部プロファイラソフトを使わないといけないので、なおさらエンジニアの仕事かなと
UE4のプロファイラでドローコール数が表示されるものは色々とあるものの、少しばかり検証してみましたが正直何が原因で増えているのか細かいところまでは分かりにくく、ひとまずは上記のような感じで覚えておこう‥と思うのでした。。
何かご意見や補足などありましたらコメント頂ければ嬉しく思います‥!
p.s.
赤めがね(@redglasses67)さんの「GREE Tech Talk #07」のレポート記事に、大前さんのUnityでのドローコールに関するご講演についてまとめられており、とても参考になりました(ありがとうございますっ!)。