[UE5.7.3][RenderDoc]RenderDocでGPU計測する方法

https://renderdoc.org

Latest Stable Build(.zip) を選ぶ

それは初回起動時の匿名データ収集の確認画面
一番下を選べばOK

「Do not gather or submit any statistics.」

起動する

Executable Pathに UEのパスを入れる

D:\Program Files\Epic Games\UE_5.7\Engine\Binaries\Win64\UnrealEditor.exe

Command Line ArgumentsにUEプロジェクトのパスを入れる


D:\Sandbox\UE573petit25Cl\UE574petit25Cl_Lighting\UE574petit25Cl.uproject

Lunchで起動すると

RenderDoc経由でUEが起動する

UE開いたら

UEにフォーカス当てて👉 F12押す

出てきたキャプチャをダブルクリックすると

Filterを使って描画やCompute処理だけに絞って確認しています。
DrawCallはDrawIndexed DrawInstanced Dispatch Clearなので

Dispatch をFillterしてみると見えた。

Filterはこう使う👇

■ ■ 重い描画だけ見たい

Draw

■ ■ Computeだけ

Dispatch

■ ■ 特定のPass

BasePass

どのDrawCallを見るべきか?

見る順番はこれでOK。

1. まず「大きいPass名」を見る

UEならこのあたりを探す。

ShadowDepths
影が重いか見る。

BasePass
メッシュ本体の描画。マテリアルやテクスチャ参照を見る。

Lighting / DeferredLighting
ライト計算を見る。

Translucency
半透明。重くなりやすい。

PostProcess
Bloom、Tonemap、DOF、独自ポストを見る。

2. 次に、その中のDrawを見る

Passを開いて、こういう行をクリックする。

DrawIndexed
DrawInstanced
Dispatch

クリックしたら右側で見る場所は3つ。

Texture Viewer
→ 何が描かれているか見る。

Pipeline State
→ どのShader、Texture、Blend設定か見る。

Mesh Viewer
→ どのメッシュを描いているか見る。

まずShadow、BasePass、Translucency、PostProcessなどの大きいPass単位で見て、次にDrawIndexedやDispatchを選んで、RenderTarget・Shader・Texture参照を確認します。

最初に見るおすすめ

迷ったらまずこれ。

BasePassのDrawIndexed  や  PostProcessのDraw/Dispatchだが
→ マテリアル、テクスチャ、メッシュが確認しやすい。
BassPassが出たらクリックしてフラッグを立てるそして、Filterを解除

フラッグが立っている場所までスクロールすると中が見える状態

ExecutecommandListに入ってるのが見えないので。設定を変えてキャプチャし直し。

DX12ではExecuteCommandListsとしてまとまって見える場合があるので、RenderDocではCapture all Cmd Listsを有効にするか、確認用にDX11で起動してDrawIndexed単位で確認します。

■ やり直す設定

RenderDocの Launch Application 画面でチェックする:

  • Capture all Cmd Lists
  • Ref all Resources も付けてOK

DX11でやる

Command Lineにこれ入力👇

"D:\Sandbox\UE573petit25Cl\UE574petit25Cl_Lighting\UE574petit25Cl.uproject" -d3d11 -NoRHIThread

DX12ではDrawCallがコマンドリストにまとまるため、Pass単位で処理を確認しつつ、必要に応じてDX11でDrawIndexed単位でも確認しています。

見つかった!

DrawIndexedInstanced(6, 17)

意味:

  • Index数:6(1ポリの簡単な形)
  • Instance数:17(同じものを17個描画)

👉 パーティクル or 草(インスタンシング)

DrawIndexedInstancedを見て、インスタンシングで同じメッシュを複数描画していることを確認できます。

1回のDrawCallで複数インスタンスを描画しているため、DrawCall削減による最適化がされています。

次見るべきポイント PSSetShader (Pixel Shader)

重そうか(分岐 / テクスチャ数) マテリアル名

PSSetShaderResources テクスチャ数(ここ重要)

見る

  • 何枚使ってるか
  • 無駄に多くないか

目安

  • 1〜3枚 → 軽い
  • 4〜6枚 → 普通
  • 7枚以上 → 重い可能性

このDrawはまだ画面を全部埋めてない


■ ここでやるべき操作(超重要)

■ ① Eventを少しずつ進める

👉 左のEvent Browserで

  • ↓キー or クリックで1個ずつ進む

■ ② 右のTexture Viewerを見る

👉 変化を見る

変わった

■ 今起きてること

👉 Eventを進めたことで

  • 上の黒い部分に
  • 小さい点(葉っぱ)が出てきた

👉 つまり

このDrawが実際に画面に何かを描いてる


■ 今のDrawの正体

左を見ると👇
DrawIndexedInstanced(6, 16)

👉 意味

  • 小さいメッシュ(葉っぱ)
  • 16個まとめて描画

👉 つまり

パーティクル or インスタンス草

■ ① このDrawで何が変わった?

👉 右画面で見る

  • 点が増えた
  • 画面に追加された

👉 これ言える

「このDrawでパーティクルが追加されているのが確認できます」

イベントを進めることで、最初は未描画だった画面が、各Drawによって徐々に埋まっていく様子を確認できます。

チェッカーが消えるタイミングを見ることで、どの描画処理が最終的な画面に影響しているかを特定できます。

RenderDocではイベントを進めながら、どのDrawで画面に要素が追加されるかを確認しています。今回のケースでは、インスタンシングされたパーティクルが描画されているのが確認できます。

このようにDrawごとの変化を見ることで、描画順や負荷のかかる処理を特定しています。

■ ここまでできてること

  • DrawCall見つけた
  • 実際の変化を追えてる
  • インスタンシング理解してる

■ どういう意味?

RenderDocの流れ👇

  1. 最初
    👉 何も描いてない(黒 / チェッカー)
  2. 途中
    👉 一部だけ描画(点・葉っぱ)

  3. 👉 全体が描画で埋まった ← 今ここ

👉 つまり

この辺のDrawで最終結果に近づいた

イベントを進めることで、最初は未描画だった画面が、各Drawによって徐々に埋まっていく様子を確認できます。

チェッカーが消えるタイミングを見ることで、どの描画処理が最終的な画面に影響しているかを特定できます。

状態は「まだ画面を全部塗るDrawに来てない」ってこと。
(チェッカーが残ってる=未描画領域がある)

■ 今の位置の意味

左を見ると👇

  • BasePass
  • DrawIndexedInstanced(6, 17)(葉っぱ)

👉 これは

“オブジェクト描画フェーズ”


👉 だから

  • 一部だけ描かれる
  • 画面全部は埋まらない
  • チェッカー残る

■ 次に探すべきもの(重要)

👉 画面を一気に埋めるDraw


■ 目印

これ探す👇

  • PostProcess
  • Tonemap
  • Fullscreen
  • Resolve
  • Composite

■ 何が起きてるか(技術的に)

👉 今のDrawで

  • SceneColorに
  • あなたのHLSLで描いた月が加算された

👉 つまり

Pixel Shaderが最終色を決めている瞬間

このDrawでは、独自のHLSLシェーダを使って月の表現を描画していて、SceneColorに対してピクセル単位で最終色を出力しています。

RenderDocでこのDrawを確認することで、実際にどのシェーダが最終結果に影響しているかを特定できます。

このようにDrawごとの出力を追うことで、意図したシェーダが正しく画面に反映されているかを検証できます。

■ ここで見るべきポイント(重要)


■ ① Pixel Shader

👉 ここ

PSSetShader

HLSLが動いてる場所

■ ② Shader Resource(テクスチャ)

👉 月の模様

Shader Resource View

■ ③ DrawIndexedInstanced

👉 描画回数

■ さらに強い視点

  • フルスクリーンじゃない → オブジェクト描画
  • 一部だけ変わる → メッシュ単位
  • ピクセルで模様 → Pixel Shader

RenderDocを使うことで、実際の描画結果とシェーダの対応関係を確認しています。

■ 結論(今回のケース)

👉 重くなりやすい要因はこれ

① パーティクル(葉っぱ)のインスタンス描画

  • DrawIndexedInstanced(6, 16/17)
  • 数が増えると一気に負荷増える

② Pixel Shader負荷

  • 独自HLSL(月の模様)
  • ピクセル単位で計算してる

③ テクスチャ参照

  • PSSetShaderResources
  • 複数テクスチャ使ってる

④ オーバードロー(これが一番重要)

👉 葉っぱ(半透明)が重なる
👉 同じピクセル何回も計算される


■ 一言でまとめると

パーティクルのオーバードロー+ピクセルシェーダ負荷


今回のケースでは、パーティクルのインスタンス描画によるオーバードローと、ピクセルシェーダの計算量が主な負荷要因だと考えています。


特に半透明オブジェクトは重なりやすく、ピクセル処理が増えるため注意が必要です。


■ もう一段上

👉 改善案も言う

  • インスタンス数制御
  • テクスチャ削減
  • シェーダ簡略化
  • LODや距離カリング

■ まとめ

👉 今回の分析

  • Draw見た
  • Shader見た
  • 結果から原因言えた

コメントを残す

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