285.1K Views
October 11, 22
スライド概要
シーン(Level)上のカクツキを解消するために、ボトルネックとなっている処理を特定することは非常に重要です。この資料では問題となっている箇所を探し最適化を行う基本的な流れを紹介します。
Unreal Engineを開発・提供しているエピック ゲームズ ジャパンによる公式アカウントです。 勉強会や配信などで行った講演資料を公開しています。 公式サイトはこちら https://www.unrealengine.com/ja/
プロファイリング&最適化の始め方 Epic Games Japan Yutaro Sawada
内容 ・プロファイリング ・各種最適化
プロファイリングの意義 ・シーン(Level)のカクツキ(ヒッチ)を解消するために ボトルネックとなっている箇所を特定することは非常に重要 → やみくもに原因ではない箇所を最適化しても目標はなかなか達成できない
プロファイリング - 方法 ・Unreal Engineの内部機能 ・Stat機能 ・ProfileGPU ・Unreal Insight ・外部ツール ・RenderDoc
プロファイリング - 方法 ・Unreal Engineの内部機能 ・Stat機能 ・ProfileGPU ・Unreal Insight ・外部ツール ・RenderDoc
Output Log
Stat機能 - command: stat unit 最初に見るべき数値
Stat機能 - 確認できること ・確認できること ・CPUネックなのかGPUネックなのか ・悲しい例: CPUが重いのにGPUを変えても速くならない GPUが重いのにCPUを変えても速くならない
Stat機能 - 確認できること ・Game(CPU) リアルタイムで動作するゲームのロジック、アニメーションの評価等 ・Draw(CPU) 何を描画するか選択、描画命令を準備する ・GPU メッシュ、各マテリアルの描画、ライティング、ポストプロセス ・RHIT(CPU) CPUとGPUを橋渡ししているスレッド(作成した描画命令をGPUへ) ・映像の場合GPUネックとなっているケースが多い
Stat GPU - command: stat gpu ・GPUを更に詳しく見たい場合 時間がかかっているパスをリアルタイムで表示可能
Profile GPU機能 - command:profilegpu 1フレームのGPU処理 ・ログにテキストで出力 ・UI:GPU Visualizer 重い箇所を把握する
Profile GPU機能 全体の中から重い箇所を把握し、 30fpsだと33.33ms 60fpsだと16.66msに収めることが必要 重いパスを探して軽量化する方法を探す ・設定をネットで検索 or コマンドの補完で探す
軽量化設定を探す方法 コマンド入力欄にqualityと入れると 候補にポストプロセスなどの軽量化設定が数多く存在 UEでは様々なプラットフォームに対応するため 段階的に設定可能な品質設定が用意されている
Command - help : ? コマンドの後ろに?を追加するとそのオプションについて詳細と現在の値を表示 リアルタイムで反映されるため、 見た目を確認しつつこれらを 設定することが軽量化の第一歩
プロファイリング - 方法 ・Unreal Engineの内部機能 ・Stat機能 ・ProfileGPU ・Unreal Insight ・外部ツール ・RenderDoc
Unreal Insights 複数フレームに渡って、 CPU、GPU等の処理負荷を計測
Unreal Insightsの取得方法 ・マーカーを追加 stat namedevents 1 ・以下のコマンドでトレースをスタート Trace.File default ・以下コマンドでストップ Trace.Stop Trace.Start CPU,GPU 等 トレース情報をオプションで指定可能 詳しくは後述の記事で紹介 \ProjectName\Saved\Profiling以下に.utraceファイルとして保存
Unreal Insightsの取得方法 UnrealInsights.exeを起動しトレースファイルを開く UE4の場合以下パスのUnrealInsights.exeを直接起動 \Engine\Binaries\Win64\UnrealInsights.exe
Unreal Insights具体的な調査方法 参考リンク とってもお手軽にエディタでUnreal Insightsのプロファイルを取る方法 https://qiita.com/EGJ-Osamu_Saito/items/228f0f3fae4bf56365c7 [UE4] Unreal InsightsでCPUのボトルネックを調べて修正する https://qiita.com/donbutsu17/items/159dfaacfac6a4b1392d
プロファイリング - 方法 ・Unreal Engineの内部機能 ・Stat機能 ・ProfileGPU ・Unreal Insight ・外部ツール ・RenderDoc
RenderDoc 外部ツール GPUで実行される描画パスを個別に(Materialごとに)確認することが可能 https://renderdoc.org/
RenderDoc インストール後、プラグインを有効化することで連携が簡単に
RenderDoc
RenderDoc Event Browser -> Texture Viewer -> Outputで該当パスの出力画像を確認
RenderDoc Event Browser -> Mesh Viewer -> VS In / VS Outで描画メッシュを確認
RenderDoc Controlの時計アイコンを実行 -> 大まかな時間を計測 描画負荷の高いパスを特定
RenderDocおすすめ設定 デフォルトがマイクロ秒(μs)なのでミリ秒(ms)へ変更 Tool - Settings - Event Browser -
RenderDocの詳しい解説 https://www.docswell.com/s/EpicGamesJapan/59GRJK-UE4_HistoriaCarava n19_RenderDoc
内容 ・プロファイリング ・各種最適化
よくある重い場所 ・Prepass、Base Pass、Shadow Depthが重い またはドローコール(パス)が多い ◇ 対応策 ・モデルの軽量化(Nanite化、LODの追加、ポリゴン数の削減) ・ドローコールの削減 ・カリングの強化 ・複雑なマテリアルを削減 ・ポストプロセス ◇ 対応策 ・Postprocess quality等で調整 (ProfileGPUコマンドで紹介した方法)
アセットリダクションについて https://www.docswell.com/s/EpicGamesJapan/Z2MVRZ-ue4-95238296#p1
Merge Actors - ドローコールの削減 必ず1セットで映るものは、まとめてしまうとドローコールを削減可能 レベル上でMesh Actorを選択し、Tools -> Merge Actorsを実行
Merge Actors ・必要なオプション Merge Materialsで描画を削減 (Material単位で描画は行われるため) Replace Source Actorsでレベル上のものを置き換え
Merge Actors 実行すると置き換えられる 例は遠景ですが、 小物で大量に映るものに有効 すべてをマージしてしまうと カリング効率が悪くなり危険
カリングについて 画面に映っていないものを省く処理 以下コマンドを活用して確認 FreezeRendering:描画状態を止める ToggleDebugCamera:止めたまま移動 画面に写っていないモノがあれば Boundsを調整する [UE4] ゲーム実行時のカリングを確認する方法 https://qiita.com/EGJ-Yutaro_Sawada/items/5a3c8b91d9b837584202
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も省く
シェーダーの複雑度(重いマテリアルの特定) Materialが重い原因 ・半透明 ・描画の重なりが多い ・テクスチャの枚数が多い等
まとめ 紹介したプロファイリング機能をまとめると、、 ・はじめに処理負荷を見るのは、Statsコマンド機能 ・次に大まかに見るものとしてProfileGPUコマンド ・複数フレームの処理全体像を見る場合はUnrealInsights ・1フレームを詳しく見る場合RenderDoc ボトルネックとなっている箇所を特定し最適化することが重要