3DCGの資料で「Forward Rendering」「Deferred Rendering」って見かけますよね
なにやらDeferred Renderingだと処理が軽くなるらしい
本当に軽くなるのか、軽くなるケースはどういう場合なのか
気になったのでUnityで性能比較を行いつつ処理の違いをまとめました
用意したマップ
Blenderの勉強も兼ねて自分で作りました
カメラ視点
では早速カメラをForward/Deferredに切り替えてStatisticsの値を比べてみましょう
これで爆速になるに違いない
勝ったなガハハ
Statistics結果
Forward Rendering | Deferred Rendering |
---|---|
変化がない!!!!
それはそう
なぜならDeferred Renderingの強みを活かせてないから
本命は次!
マップ全景
カメラ視点
この状態でForward/Deferredの違いを見てみましょう
Forward Rendering結果 | Deferred Rendering結果 |
---|---|
ぜんぜん違う!!!!
SetPass callsの変化
Forward | Deferred | |
---|---|---|
サンプル1 | 281 | 284 |
サンプル2(Point Light 4つ追加) | 3253 | 712 |
SetPass callsがForwardだと10倍以上増えてるのに、Deferredだと2倍程度で抑えています
FPSは本来60%Downのところを30%Downで止めてます (これはマシンスペックによって変わると思います
なぜこれほど差分がでるのか、これから解説していきます
以下はForward Renderingを簡易的にフロー化しました
ライティングでは以下の計算を行います
この処理をライトの数だけ行うので効率が悪くなっています
以下はDeferred Renderingを簡易的にフロー化しました
ラスタライズ後にジオメトリ情報をG-Bufferにキャッシュ
G-Bufferを元にライティングする考えがDeferred(遅延) Rendering
ライトが増えてもG-Bufferを元にライティングするだけで済むので効率がいいのがわかります
夜の街を歩く場合はとくに効果が大きそうです
ライトが複数あり、複雑なオブジェクトがライト範囲にある場合、
Deferred Renderingがかなり優位に働くことがわかりました
計測値を比較・検証したことで具体的に描画負荷を抑えれるケースを知れたので実践でも使えそうです
ビルディングはこちらの動画を元に作成させていただきました
KLabのゲーム開発・運用で培われた技術や挑戦とそのノウハウを発信します。
合わせて読みたい
KLabのゲーム開発・運用で培われた技術や挑戦とそのノウハウを発信します。