Unreal Engine - プロファイリング&最適化の始め方

196.6K Views

October 11, 22

スライド概要

シーン(Level)上のカクツキを解消するために、ボトルネックとなっている処理を特定することは非常に重要です。この資料では問題となっている箇所を探し最適化を行う基本的な流れを紹介します。

profile-image

Unreal Engineを開発・提供しているエピック ゲームズ ジャパンによる公式アカウントです。 勉強会や配信などで行った講演資料を公開しています。 公式サイトはこちら https://www.unrealengine.com/ja/

シェア

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

プロファイリング&最適化の始め方 Epic Games Japan Yutaro Sawada

2.

内容 ・プロファイリング ・各種最適化

3.

プロファイリングの意義 ・シーン(Level)のカクツキ(ヒッチ)を解消するために ボトルネックとなっている箇所を特定することは非常に重要 → やみくもに原因ではない箇所を最適化しても目標はなかなか達成できない

4.

プロファイリング - 方法 ・Unreal Engineの内部機能 ・Stat機能 ・ProfileGPU ・Unreal Insight ・外部ツール ・RenderDoc

5.

プロファイリング - 方法 ・Unreal Engineの内部機能 ・Stat機能 ・ProfileGPU ・Unreal Insight ・外部ツール ・RenderDoc

6.

Output Log

7.

Stat機能 - command: stat unit 最初に見るべき数値

8.

Stat機能 - 確認できること ・確認できること ・CPUネックなのかGPUネックなのか ・悲しい例: CPUが重いのにGPUを変えても速くならない GPUが重いのにCPUを変えても速くならない

9.

Stat機能 - 確認できること ・Game(CPU) リアルタイムで動作するゲームのロジック、アニメーションの評価等 ・Draw(CPU) 何を描画するか選択、描画命令を準備する ・GPU メッシュ、各マテリアルの描画、ライティング、ポストプロセス ・RHIT(CPU) CPUとGPUを橋渡ししているスレッド(作成した描画命令をGPUへ) ・映像の場合GPUネックとなっているケースが多い

10.

Stat GPU - command: stat gpu ・GPUを更に詳しく見たい場合 時間がかかっているパスをリアルタイムで表示可能

11.

Profile GPU機能 - command:profilegpu 1フレームのGPU処理 ・ログにテキストで出力 ・UI:GPU Visualizer 重い箇所を把握する

12.

Profile GPU機能 全体の中から重い箇所を把握し、 30fpsだと33.33ms 60fpsだと16.66msに収めることが必要 重いパスを探して軽量化する方法を探す ・設定をネットで検索 or コマンドの補完で探す

13.

軽量化設定を探す方法 コマンド入力欄にqualityと入れると 候補にポストプロセスなどの軽量化設定が数多く存在 UEでは様々なプラットフォームに対応するため 段階的に設定可能な品質設定が用意されている

14.

Command - help : ? コマンドの後ろに?を追加するとそのオプションについて詳細と現在の値を表示 リアルタイムで反映されるため、 見た目を確認しつつこれらを 設定することが軽量化の第一歩

15.

プロファイリング - 方法 ・Unreal Engineの内部機能 ・Stat機能 ・ProfileGPU ・Unreal Insight ・外部ツール ・RenderDoc

16.

Unreal Insights 複数フレームに渡って、 CPU、GPU等の処理負荷を計測

17.

Unreal Insightsの取得方法 ・マーカーを追加 stat namedevents 1 ・以下のコマンドでトレースをスタート Trace.File default ・以下コマンドでストップ Trace.Stop Trace.Start CPU,GPU 等 トレース情報をオプションで指定可能 詳しくは後述の記事で紹介 \ProjectName\Saved\Profiling以下に.utraceファイルとして保存

18.

Unreal Insightsの取得方法 UnrealInsights.exeを起動しトレースファイルを開く UE4の場合以下パスのUnrealInsights.exeを直接起動 \Engine\Binaries\Win64\UnrealInsights.exe

19.

Unreal Insights具体的な調査方法 参考リンク とってもお手軽にエディタでUnreal Insightsのプロファイルを取る方法 https://qiita.com/EGJ-Osamu_Saito/items/228f0f3fae4bf56365c7 [UE4] Unreal InsightsでCPUのボトルネックを調べて修正する https://qiita.com/donbutsu17/items/159dfaacfac6a4b1392d

20.

プロファイリング - 方法 ・Unreal Engineの内部機能 ・Stat機能 ・ProfileGPU ・Unreal Insight ・外部ツール ・RenderDoc

21.

RenderDoc 外部ツール GPUで実行される描画パスを個別に(Materialごとに)確認することが可能 https://renderdoc.org/

22.

RenderDoc インストール後、プラグインを有効化することで連携が簡単に

23.

RenderDoc

24.

RenderDoc Event Browser -> Texture Viewer -> Outputで該当パスの出力画像を確認

25.

RenderDoc Event Browser -> Mesh Viewer -> VS In / VS Outで描画メッシュを確認

26.

RenderDoc Controlの時計アイコンを実行 -> 大まかな時間を計測 描画負荷の高いパスを特定

27.

RenderDocおすすめ設定 デフォルトがマイクロ秒(μs)なのでミリ秒(ms)へ変更 Tool - Settings - Event Browser -

28.

RenderDocの詳しい解説 https://www.docswell.com/s/EpicGamesJapan/59GRJK-UE4_HistoriaCarava n19_RenderDoc

29.

内容 ・プロファイリング ・各種最適化

30.

よくある重い場所 ・Prepass、Base Pass、Shadow Depthが重い またはドローコール(パス)が多い ◇ 対応策 ・モデルの軽量化(Nanite化、LODの追加、ポリゴン数の削減) ・ドローコールの削減 ・カリングの強化 ・複雑なマテリアルを削減 ・ポストプロセス ◇ 対応策 ・Postprocess quality等で調整 (ProfileGPUコマンドで紹介した方法)

31.

アセットリダクションについて https://www.docswell.com/s/EpicGamesJapan/Z2MVRZ-ue4-95238296#p1

32.

Merge Actors - ドローコールの削減 必ず1セットで映るものは、まとめてしまうとドローコールを削減可能 レベル上でMesh Actorを選択し、Tools -> Merge Actorsを実行

33.

Merge Actors ・必要なオプション Merge Materialsで描画を削減 (Material単位で描画は行われるため) Replace Source Actorsでレベル上のものを置き換え

34.

Merge Actors 実行すると置き換えられる 例は遠景ですが、 小物で大量に映るものに有効 すべてをマージしてしまうと カリング効率が悪くなり危険

35.

カリングについて 画面に映っていないものを省く処理 以下コマンドを活用して確認 FreezeRendering:描画状態を止める ToggleDebugCamera:止めたまま移動 画面に写っていないモノがあれば Boundsを調整する [UE4] ゲーム実行時のカリングを確認する方法 https://qiita.com/EGJ-Yutaro_Sawada/items/5a3c8b91d9b837584202

36.

Ray Tracingのカリング設定 - City Sample r.RayTracing.NonBlockingPipelineCreation r.RayTracing.Culling r.RayTracing.Culling.Radius r.RayTracing.Culling.Angle Render/RHI Threadを止めずに裏でレイトレ用パイプラインを生成、シェーダ生成など間に TRUE 合ってない場合は真っ黒になるが、ヒッチは起きない 3 一番アグレッシブなカリング方法。距離と視界からの大きさでカリングをする 15000 City Sample向けにチューニング150m以上奥のオブジェクトをカリング 0.5 City Sample向けにチューニング、デフォルトより小さいオブジェクトのみカリング r.RayTracing.Culling.UseGroupIds 1 レイトレ内でグループ(ID)となっているものがあれば、それ単位でカリング r.RayTracing.Geometry.NiagaraRibbons 0 高速化のためNiagaraをレイトレ界から省く r.RayTracing.Geometry.NiagaraSprites 0 高速化のためNiagaraをレイトレ界から省く r.RayTracing.Geometry.NiagaraMeshes 0 高速化のためNiagaraをレイトレ界から省く r.RayTracing.ExcludeTranslucent r.RayTracing.Geometry.InstancedStaticMeshes TRUE 高速化のため半透明オブジェクトもレイトレ界から省く 0 InstancedStaticMeshも省く

37.

シェーダーの複雑度(重いマテリアルの特定) Materialが重い原因 ・半透明 ・描画の重なりが多い ・テクスチャの枚数が多い等

38.

まとめ 紹介したプロファイリング機能をまとめると、、 ・はじめに処理負荷を見るのは、Statsコマンド機能 ・次に大まかに見るものとしてProfileGPUコマンド ・複数フレームの処理全体像を見る場合はUnrealInsights ・1フレームを詳しく見る場合RenderDoc ボトルネックとなっている箇所を特定し最適化することが重要