129.6K Views
August 31, 17
スライド概要
CEDEC2017の講演資料を公開します。
http://cedec.cesa.or.jp/2017/session/ENG/s59102d1ea3268/
Unreal Engineを開発・提供しているエピック ゲームズ ジャパンによる公式アカウントです。 勉強会や配信などで行った講演資料を公開しています。 公式サイトはこちら https://www.unrealengine.com/ja/
UE4 プロファイリングツール総おさらい (グラフィクス編) Nori Shinoyama Senior Support Engineer @ Epic Games Japan #UE4CEDEC
最適化の前にプロファイル はじめに #UE4CEDEC
本日の内容 UE4のプロファイリングツールを俯瞰で眺めながら、 UE4上でどのように プロファイルしていくのかを見ていきます #UE4CEDEC
なぜプロファイル? どうしてそんな狭く地味な範囲を? 最適化じゃないの? #UE4CEDEC
なぜプロファイル? あるあるCase.1 ありがたいことに、コミュニティやライセンシ様のおかげで、 ネット上に沢山の最適化Tipsが出てくるようになりました。 Tips1 Tips2 Tips3 Optimization #UE4CEDEC
なぜプロファイル? あるあるCase.1 でも、こんなときはどうしましょう? 「今週中にこのシーン60fpsで安定させて。まだ20fpsしか出ないけど」 Tips1 ?? Tips2 ?? Tips3 ?? 一つしかできないなら。。 Optimization どれ? #UE4CEDEC
なぜプロファイル? あるあるCase.1 でも、こんなときはどうしましょう? 「今週中にこのシーン60fpsで安定させて。まだ20fpsしか出ないけど」 Tips1 Profiling どれが一番効果的? Tips2 Tips3 Optimization #UE4CEDEC
なぜプロファイル? あるあるCase.2 全部やりました!! Tips1 Tips2 Tips3 。。本当に必要? #UE4CEDEC Optimization
なぜプロファイル? あるあるCase.2 半透明は重いらしいので、 エフェクトは減らしました! すべてのテクスチャ 解像度を512に落としました! DrawCall増えると怖いので オブジェクトをまとめました! とりあえずライトはMovable をやめて全部Stationaryに! #UE4CEDEC
なぜプロファイル? あるあるCase.2 Tips1 Profiling どれはやらなくていい? Tips2 Tips3 Optimization #UE4CEDEC
どちらも極端な例ですが、 実際の制作現場でよくあることだと思います。 #UE4CEDEC
プロファイルしない最適化は危険 中身を知らずにとりあえずその設定を試したり。。 ボトルネックと違うところを最適化したり。。 最適化に時間や労力をかけても、 パフォーマンスは上がらず、 クオリティだけ下がってしまったり。。 #UE4CEDEC
なぜプロファイル? 最適化の前に、 開発初期から、日常的に、 プロファイルする癖を ボトルネックの予測精度を上げて。。。 ボトルネック部分 -> 短時間で効率的な最適化を ボトルネックじゃない部分 -> 贅沢に使いクオリティアップに #UE4CEDEC
UE4の充実したプロファイリングツール #UE4CEDEC
本日の内容 (再掲) UE4のプロファイリングツールを俯瞰で眺めながら、 UE4上でどのように プロファイルしていくのかを見ていきます #UE4CEDEC
本講演の対象者 UE4を触って頂いている 技術寄りのアーティストやデザイナの方がメインです (触っていない方は、UE4はこんな機能があるのか~と眺めて頂ければ) #UE4CEDEC
本講演で話さないこと • コリジョン、ネットワーク、アニメーションなどの プロファイル手法 • モバイルやVRに特化した内容 • きれいな絵作りする方法 • プラットフォーム固有の話 #UE4CEDEC
備考 • Twitter等での情報拡散にご協力ください。 – #UE4CEDEC • 本資料はすぐにネットにアップされます。 • エディタは英語版を使います。 • UE4.17をベースにします。 • 質疑応答は時間があまれば。。 #UE4CEDEC
本講演の目次 1. 2. 3. 4. 5. 6. はじめに 基本のプロファイリングツール 1 プロファイルの流れ 基本のプロファイリングツール 2 Showcase まとめ&おまけ #UE4CEDEC
本講演の目次 1. 2. 3. 4. 5. 6. はじめに 基本のプロファイリングツール 1 プロファイルの流れ 基本のプロファイリングツール 2 Showcase まとめ&おまけ #UE4CEDEC
Console Command & CVars 基本のプロファイリングツール 1 #UE4CEDEC
Console Command & Console Variables (CVars) #UE4CEDEC
Console Command & Variables (CVars) コマンドによって、ゲーム内の挙動を変えたり情報を出力する方法 (大文字小文字の区別はありません) #UE4CEDEC
Console Command & Console Variables (CVars) 一覧表の作成 Help -> “Console Variables” を選ぶ事によって、全コマンドのHTMLヘルプを出力 #UE4CEDEC
Console Command & Console Variables (CVars) 一覧表 .htmlファイルで、各コマンドとそのヘルプを出力してくれる #UE4CEDEC
Command入力方法 #UE4CEDEC
Command / CVar の送り方 1 開発機にキーボードを指して、コンソールウィンドウを立ち上げる (Editorでももちろん可能。Output Windowからも入力できる。) #UE4CEDEC
Console Windowを立ち上げショートカットの指定 Project Settings/ Input の一番下に “Console Keys” という設定があり、 そこで指定できます。 #UE4CEDEC
Command / CVar の送り方 2 Blueprintで送る “Execute Console Command” ノード #UE4CEDEC
Command / CVar の送り方 3 SessionFrontendを使って、PC上から実機で動いている アプリケーションに対してコマンドを送る #UE4CEDEC
Command / CVar の送り方 4 起動時引数で送る –execmds=“コマンドA, コマンドB” ”,” で複数コマンドを区切る #UE4CEDEC
では、 プロファイルに使えるコマンドを見ていきます #UE4CEDEC
Stat fps / unit / unitgraph #UE4CEDEC
Console Command stat fps / stat unit / stat unitgraph CPUやGPUの負荷を表示する基本コマンド Stat fps Stat unit Stat unitgraph #UE4CEDEC
レンダリングから見た Game / Draw / GPU CPU GPU Game Draw 世界のアップデート Gameから来た シーンを解釈して GPU描画命令 (DrawCallなど) に変換する 時計の針を進めて キャラクタの動き 物理などを確定 #UE4CEDEC GPU GPUが実際に頂点 やピクセルを計算 して絵をつくる
Game Draw GPU 合計がそのフレームの処理時間じゃないの?? #UE4CEDEC
Game / Draw / GPU の並列処理 VSync Game Draw GPU Display VSync 1 VSync 2 1 2 1 2 0 1 2 各処理が並行で進んでいるため、 Game/Draw/GPUの最大がそのフレームの処理時間になる。 この図はあくまで概要です。 実際のスレッドの流れは、プラットフォームやレンダリング手法で異なります。 #UE4CEDEC
CPU Game GPU Draw GPU 本日はDrawとGPUのプロファイルがメイン #UE4CEDEC
CPU Game GPU Draw GPUの処理負荷を見てみる #UE4CEDEC GPU
GPUの処理負荷を見てみる #UE4CEDEC
GPUの処理負荷を階層的に出すConsole Command “ProfileGPU” (Default shortcut: “Ctrl + Shift + ,”) #UE4CEDEC
コンソールなどの実機では、 ウインドウは出ずに出力ウィンドウにテキストで表示できます。 #UE4CEDEC
Tips (Advanced) BasePass内部で、各メッシュ単位の負荷を出さない機種もある Editor #UE4CEDEC Console
Tips (Advanced) 実機でBasePassのメッシュ単位の処理負荷を出力する方法 • r.ShowMaterialDrawEvents – ただし、RHIThreadがOffじゃないと動作しない。 • r.RHISetGPUCaptureOptions – 一括設定コマンド – 自動でRHIThreadをOffに • ※DrawThreadの負荷が跳ね上がります。 – 計測するときにOnにして、それ以外ではOffに。 #UE4CEDEC
Console Command Stat GPU ProfileGPUのリアルタイム表示版 #UE4CEDEC
レンダリングの流れは去年のCEDECで講演させていただきました SlideShareにUpしてあるので、良ければご参考にしてください #UE4CEDEC
CPU Game GPU Draw GPU profilegpu stat gpu #UE4CEDEC
CPU Game GPU Draw Drawの処理負荷を見てみる まえに。。。 #UE4CEDEC GPU
CPU Game GPU Draw GPU CPU側の処理負荷 確認方法 #UE4CEDEC
ConsoleCommand Stat dumpframe 1フレームのCPU処理フローの階層表示 #UE4CEDEC
ConsoleCommand Stat dumpframe 1フレームのCPU処理フローの階層表示 17.773ms ( 27) - Thread_12a6c_0 - RenderThread 16.084ms ( 1) - RenderViewFamily 7.650ms ( 1) - DeferredShadingSceneRenderer Lighting 7.258ms ( 1) - Lighting drawing 2.104ms ( 1) - Base pass drawing 1.946ms ( 1) - StaticDrawList drawing 1.368ms ( 1) - InitViews 例: Dumpされた部分のRenderThread部分 #UE4CEDEC
Stat dumpframe オプションで見やすい形に調整可能 例: Drawの処理負荷を計測する方法 stat dumpframe -root=renderthread –depth=5 -ms=.1 どの処理から下を表示するか? 例: Gamethread Renderthread Initviews #UE4CEDEC 何階層深くまで表示するか 何ms以上の処理だけ記載するか
Console Command stat startfile / stopfile 複数フレームをキャプチャして、後々にエディタで処理負荷をチェックする #UE4CEDEC
stat startfile / stopfile 使い方 Stat stopfileと打ち込むと、プロファイルデータを出力する 書き出し先はログ(LogStats)に出る #UE4CEDEC
stat startfile / stopfile 使い方 Session Frontend を立ち上げる #UE4CEDEC Profiler Tabからファイルを読み込む
例えば、各アクターのTickがどれだけかかっているか? などがわかるようになります。 注意点: 処理順番ではありません。 処理負荷順や名前順でソートを変えたりできます。 #UE4CEDEC
CPU Game GPU Draw Stat dumpframe Stat startfile/stopfile #UE4CEDEC GPU CPU側の処理負荷 確認方法
CPU Game GPU Draw Stat dumpframe Stat startfile/stopfile #UE4CEDEC GPU Drawの処理負荷 を見てみる
Drawの処理負荷を見てみる #UE4CEDEC
Drawの主な役割 Draw GPU Z Prepass Base Pass Transparency ②GPUに描画命令を発行する #UE4CEDEC
Drawの主な役割 Draw GPU Z Prepass どのオブジェクトを? リストないの?? Base Pass Transparency ②GPUに描画命令を発行する #UE4CEDEC
Drawの主な役割 Draw GPU Z Prepass Init Views Base Pass Transparency ①渡すオブジェクトを選定し それぞれのパスのリストを作る #UE4CEDEC ②GPUに描画命令を発行する
InitViewsで行われるカリング Init Views ①渡すオブジェクトを選定し それぞれのパスのリストを作る #UE4CEDEC 選定方法1: Frustum Culling 選定方法2: Occlusion Culling
(CPU) Frustum Culling 見えない! Object 見えない! Object 見える Object Object 見える オブジェクトのバウンディングボックスを調べ、 画面外のオブジェクトをGPUに計算させない機能 #UE4CEDEC
Occlusion Culling 見えない! Object Object Object 見える 前面のオブジェクトに隠れて見えないオブジェクトを描画リストから外す (1フレーム前のDepthを用いて行います) #UE4CEDEC
FreezeRendering コマンドで、 その時点でのカメラのカリング結果を止めることができる。 #UE4CEDEC
Drawの主な役割 Draw GPU Z Prepass Init Views Base Pass Transparency ①渡すオブジェクトを選定し それぞれのパスのリストを作る #UE4CEDEC ②GPUに描画命令を発行する
Console Command stat SceneRendering レンダリング(Draw)の全体の処理内訳をリアルタイムで表示 #UE4CEDEC
Stat scenerendeing 注意点 (表示内容はフラットですが、) 処理内容は階層的です RenderViewFamiliy - InitViews - BasePass drawing -- StaticDrawList drawing -- Dynamic Primitive drawing #UE4CEDEC
Stat scenerendeing Stat SceneRenderingで見える負荷はDrawの負荷です。 GPUの処理ではありません! Draw が重たい場合は真っ先に参照してみてください #UE4CEDEC
ConsoleCommand stat InitViews Culling処理にかかった時間やプリミティブ数などをリアルタイムで確認 #UE4CEDEC
ConsoleCommand stat InitViews • InitViewsは何の処理をしてる?? – 画面に見えないオブジェクトを省く処理 • Frustum Culling • Occlusion Culling – レンダリングオブジェクトをソートしたり – シャドウ計算に寄与するオブジェクトもここで算出している #UE4CEDEC
stat InitViews でよく見るところ 処理時間 Frustum Cull Occlusion Cull Processed Primitives: 投入された全オブジェクト数 Frustum Culled primitives: カリングされたオブジェクト数 Occluded Culled Primitives: オクルージョンカリングされた Primitive数 生き残ったPrimitiveたち Visible Static Mesh Elements Visible Dynamic Mesh Elements #UE4CEDEC
Stat initviews Culling処理はCPU負荷をあげますが、 GPU負荷を下げるために必ず必要な処理です。 Culling負荷が高い場合、遠くのオブジェクトや目に見えないオブジェクト を自前でVisibilityをOffにしたりなどが効果があります。 また、不要なオブジェクトがGPUに投入されていないか確認するために、 FreezeRenderingコマンドも用いて下さい。 #UE4CEDEC
備考: Precomputed Visibilityについて • Precomputed VisibilityはStaticなオブジェクトに対して、シーン のある視点から見えるオブジェクトを事前計算しリストを作成して おく手法です。 • メモリやデータサイズが増えますが、InitViewsの負荷削減につな がりますので、静的オブジェクトが多い方は参考にしてください。 • 英語ですが、以下のスレッドに使い方がとても丁寧に説明されてい ます。 – http://timhobsonue4.snappages.com/culling-precomputed-visibilityvolumes #UE4CEDEC
備考: 全体のDrawCall数を把握したい場合 Stat RHI “Draw primitive Calls”でシーン内の全DrawCall数を確認 #UE4CEDEC
CPU GPU Game Draw Stat SceneRendering Stat InitViews Stat RHI Stat dumpframe Stat startfile/stopfile #UE4CEDEC GPU
ここまででどの箇所が重たいのかだいたいわかるようになってきた Stat unit, unitgraph ? ? ? Draw Game Stat sceneredering Stat dumpframe ? Light? ? Particle? GPU profilegpu stat gpu ? Static Mesh? ? Post Process? 次は、なぜその処理が重たいのだろう?? #UE4CEDEC
各アセットやレンダリング手法の詳細 #UE4CEDEC
各処理内容に特化したStat Stat XXXXXX 100種類以上の項目がある #UE4CEDEC
各処理内容専用のコマンドや変数 レンダリング関連の設定コマンド r.XXXXXX 700種類以上 その中の影の設定コマンド r.shadow.XXXXXX 50種類以上 #UE4CEDEC
Stat unit, unitgraph ? ? ? Draw Game Stat sceneredering Stat dumpframe ? Light? ? Particle? GPU profilegpu stat gpu ? Static Mesh? ? Post Process? 各処理の専用コマンドで理由を調査 stat LightRendering, Foliage, Particle, #UE4CEDEC r.XXXXX,
プロファイリング補助コマンド #UE4CEDEC
Console Command Show オブジェクトや機能のOn/Off #UE4CEDEC
Console Command FreezeRendering 現時点のカメラのカリングをフリーズする #UE4CEDEC
Console Command ToggleDebugCamera プレイヤーのカメラから離れ、自由に視点を変えられる #UE4CEDEC
プロファイリングツール1 まとめ #UE4CEDEC
グラフィクスプロファイル全体の流れ Step.1 Game? Draw? GPU? Stat unit / stat unit graph Draw Game Step.2 どの部分が重たい? Step.3 各処理のコマンドを 使って理由を調査 補助コマンド #UE4CEDEC Stat Light? Sceneredering Initviews, rhi Dumpframe, startfile Particle? Static Mesh? stat LightRendering, Foliage,,,, GPU profilegpu stat gpu Post Process? r.XXXXX, etc. show, freezerendering, toggledebugcamera, etc.
なぜ、Console Commandから??? #UE4CEDEC
実機確認できるから! #UE4CEDEC
実機で確認しなきゃだめ? #UE4CEDEC
本講演の目次 1. 2. 3. 4. 5. 6. はじめに 基本のプロファイリングツール 1 プロファイルの流れ 基本のプロファイリングツール 2 Showcase まとめ&おまけ #UE4CEDEC
プロファイルの流れ #UE4CEDEC
オススメしない運用 PCでゲームデザインしてから、コンソールで最適化 Editor 1 ゲームプレイを 作り上げる 敵が100万体同時に 出て来るゲームだぜ! 2 Console コンソール向けに 最適化!! あれ。。。 1fpsしか出ない。 問題点 • 弱: 修正するアセットが大量になる。 • 強: 実機では実現不可能 対策1: 仕様を満たすために著しくクオリティを下げる 対策2: ゲームの仕様を再考する #UE4CEDEC
オススメする運用 PCでゲームデザイン&実機プロファイリングを 並行して行う Editor 1 ゲームプレイを 作り上げる Console 夢と現実の すり合わせ 1 ゲームプレイに必要な パフォーマンス検証 利点 • 修正アセット(手戻り)の削減 • 実現可能なゲームデザイン 全体で見れば、製品開発スピードは前者よりも速くなります。(断言) #UE4CEDEC
備考: (おすすめしない運用2) コンソールと同程度のスペックのPCによる開発 残念ながら全然あてになりません。 UE4のコードが全然違う! SDK APIがそもそも違う OS,ドライバがそもそも違う ハードウェア構成が厳密には違う 同スペックのPCとコンソールの違い #UE4CEDEC 各機種専用の 最適化を 行っている。。
プロファイルの流れ まとめ #UE4CEDEC
なぜプロファイル? (再掲) 最適化の前に、開発初期から、日常的に、 実機で プロファイルする癖を #UE4CEDEC
備考 だけど 重要 各ビルドコンフィギュレーションによる設定の差 Development Test Shipping CPU Stat (CVars) 検証コードあり 全機能使える 検証コードなし Stat unit ぐらい GPU ほぼ同じ 無効 各ビルドコンフィギュレーションによる設定の差 CPU本来の負荷は Testビルドで計測するようにしてください。 日頃Developmentビルドで計測し、重たい部分などは実際のTestビルドで。 どれだけの差が出るかを定期的に調べて下さい。 #UE4CEDEC
本講演の目次 1. 2. 3. 4. 5. 6. はじめに 基本のプロファイリングツール 1 プロファイルの流れ 基本のプロファイリングツール 2 Showcase まとめ&おまけ #UE4CEDEC
Editorのデバッグ機能 基本のプロファイリングツール 2 #UE4CEDEC
今回紹介する3つのEditor機能 Viewmode #UE4CEDEC Show Statistics
ViewMode 中間バッファやデバッグ用表示へ切り替える機能 #UE4CEDEC
ViewMode EditorのViewModeから選択可能 見れる一覧は公式ドキュメントで詳細 に説明があります。 Link: 公式ドキュメント ViewMode 一部Viewmodeは Viewmode コマンドで 実機でも見ることが可能 #UE4CEDEC
Optimization ViewModes #UE4CEDEC
Light Complexity #UE4CEDEC
Light Complexity 動的ライティングが どれだけされている かを視覚化 気づかずに、大きな ライティングをして いる際などは要注意。 5以上になると紫に なっていきます #UE4CEDEC
Console Command togglelight 文字列 文字列を含むライトをOn/Offにすることができる。 #UE4CEDEC
Deferred Lightingは 影がなければ動的ライト沢山おいても軽い? #UE4CEDEC
範囲の小さい Movable Lightを100個 #UE4CEDEC VS 範囲の大きい Movable Lightを8個
範囲の小さい Movable Lightを100個 VS 範囲の大きい Movable Lightを8個 Light Complexityでの比較 #UE4CEDEC
範囲の小さい Movable Lightを100個 VS 範囲の大きい Movable Lightを8個 処理負荷確認方法 ProfileGPU / stat GPUのLightsにGPU負荷がでます #UE4CEDEC
Q: Deferred Lightingならライトを沢山おいていいのか? ライトを沢山を”置けます”が、 ライトが触れるピクセルが増えれば増えるほど処理負荷は増えます。 簡易的に、Light Complexityという機能があるので、 そちらで高負荷なライティングの場所を探りましょう。 #UE4CEDEC
Lightmap Density #UE4CEDEC
Lightmap Density Lightmap 密度を視覚的に表示 #UE4CEDEC
Lightmap Density ライトマップの密度は 処理負荷にも影響はしますが それよりも メモリ(テクスチャストリーミング) ロード時間に影響します 事例があるので紹介させてください #UE4CEDEC
#UE4CEDEC
#UE4CEDEC
#UE4CEDEC
#UE4CEDEC
#UE4CEDEC
#UE4CEDEC
#UE4CEDEC
#UE4CEDEC
#UE4CEDEC
#UE4CEDEC
#UE4CEDEC
#UE4CEDEC
#UE4CEDEC
#UE4CEDEC
続きはスライドを! #UE4CEDEC
Stationary Light Overlap #UE4CEDEC
Stationary Lightのメインの制約 影付きStationary Lightを5つ以上重ねると、 5つ目以降のライトが”自動的に”MovableなLightになる。 #UE4CEDEC
Stationary Lightのメインの制約 #UE4CEDEC
Stationary Lightの影については、上記ブログが参考になります #UE4CEDEC http://darakemonodarake.hatenablog.jp/entry/2015/12/16/UE4/Stationary
オーバラップしたStationary Lightのランタイム負荷 • Movable Lightとして 動的シャドウを生成するこ とになるので。。 – Draw, GPUともに負荷 がかかります。 #UE4CEDEC
Stationary Lightのメインの制約 特に良いことは何もないので、 原則禁止が良いかと思います #UE4CEDEC
Shader Complexity #UE4CEDEC
Shader Complexity 各ピクセルのシェーダの 命令数の合算を表示する (赤い部分の殆どは、 半透明描画の重ね合わせ) #UE4CEDEC
Shaderの命令数の見方 Material EditorのStat Window Stat WindowにPC版での大まかなシェーダ命令数を出してくれます #UE4CEDEC
Shader Complexity の仕組み 不 透 明 不透明ポリゴンのシェーダ命令数のみ 不 透 明 半透明のシェーダ命令は加算されていく #UE4CEDEC
Shader Complexity の見方 キャラクタの シェーダ命令数が多い 多分どっちも 半透明描画が 重なってる #UE4CEDEC
Shader Complexityが赤いのは 直さなきゃ駄目? #UE4CEDEC
注意点 シェーダの命令数 ≠ シェーダの重たさ (Cycle数と言おうか。。) (大雑把に見れば=でもいいけど。。。) #UE4CEDEC
命令数と処理負荷の違い:1 1命令の重たさの違い パスワード変更しといて GDCでアテンドしてきて どちらも同じ1行(命令)だけれども、 タスク量(Cycle数)が違う。 #UE4CEDEC
命令数と処理負荷の違い:2 命令の仕方の違い 命令数: 50 命令数: 1 ビールで乾杯; もう一杯; もう一杯; もう一杯; … もう一杯; 50杯ビール飲む; 1行 50行 ※あくまでイメージです。コンパイラは賢く処理するし、実際にForLoopが1命令になるわけではありません。 #UE4CEDEC
命令数と処理負荷の違い:3 同じシェーダでも処理負荷がランタイムで変わる コンパイラは賢い。 アルファテストのあるシェーダを アルファテスト -> 色と計算するようにしたりする。(Early Exit) 透明部分の処理負荷 アルファテスト 不透明部分の処理負荷 アルファテスト #UE4CEDEC 色の計算
シェーダの命令数とシェーダの重たさの違う例1 悪意をもってマテリアルを作ると。。。スフィアに貼り付けただけで、 39命令のシェーダでも、 20msの処理負荷に #UE4CEDEC
シェーダの命令数とシェーダの重たさの違う例2 悪意をもってマテリアルを作ると。。。スフィアに貼り付けただけで、 2533命令のシェーダでも、 0.04msの処理負荷で済む。 #UE4CEDEC
注意点 シェーダの命令数 ≠ シェーダの重たさ (Cycle数と言おうか。。) (大雑把に見れば=でもいいけど。。。) #UE4CEDEC
Q. Shader Complexityで赤いのは直さなきゃ駄目? このように、 処理負荷は命令数だけでは厳密にはわかりません。 一番怖いのは、 効果の少ない最適化をしてしまうこと Shader Complexityが真っ赤だからといって、 必死に命令数を減らしても効果がないかもしれません。 ダメな例: テクスチャの参照回数がネックなのに、 キャラの重要な強調表現の計算量を減らす #UE4CEDEC
Shader Complexityのおすすめの使い方 1 キャラクタなどの不透明オブジェクト 赤や白の場合。。。 マテリアルに問題ないかエンジニアに 一度ご相談 プロファイル例: キャラクタを単純なマテリアルに差し替えて 差分計測 #UE4CEDEC
Shader Complexityのおすすめの使い方 2 半透明やMaskedマテリアル 赤や白の場合。。。 透明部分を小さくできないか検討 プロファイル例 Show Particles などを使ってエフェクトをOn/Offにしてみる #UE4CEDEC
ということで、個人的にはShader Complexity は透明物の重なり具合にのみ使っています。。。 Shader Complexity View #UE4CEDEC
それって。。。Quad Overdrawと同じじゃ。。 Shader Complexity View #UE4CEDEC Quad Over Draw
Quad Overdraw #UE4CEDEC
Quad Overdraw 同一Quadで 何回描画計算が走ったかを表示 Quad = 2 * 2 Pixel GPUはQuad単位で描画している。 Quad Over Draw #UE4CEDEC
LOD Coloration #UE4CEDEC
LOD Coloration どのLODモデルを表示して いるかを色で表示 0 #UE4CEDEC 7
LODの処理負荷確認方法 LODを使わない場合、GPU描画負荷の 様々な箇所で負荷としてできてます。 処理負荷確認方法 BasePass、Prepass, Shadowなどの 処理が重たい際に、そのオブジェクトが どれくらいの処理負荷になってるいるか 確認する。 r.staticmeshLODDistanceScaleでおお ざっぱにLODの範囲を全体で変えて、ど れぐらいの処理軽減になるか見積もれる。 #UE4CEDEC
Console Command r.staticmeshLODDistanceScale コマンドでLODのスケールを一括で変更 (大雑把に、LODを強くしたらどれだけ処理負荷が下がるかの見積もりとして) #UE4CEDEC
Optimization ViewModes を見てきました。。。 #UE4CEDEC
今回紹介する3つのEditor機能 Viewmode #UE4CEDEC Show Statistics
Tips: 実機でViewModeの変更 Console Command: ViewMode XXXX • コンソールが対応していないViewMode – – – – Unlit StationaryLightOverlap Lit_DetailLighting ReflectionOverride • r.ForceDebugViewModesを1にすると。。 – ShaderComplexityも可能 #UE4CEDEC
ConsoleCommand ViewMode “HOGEHOGE” 一覧 • • • • • • • • • • • • • • • • • • • • • • • case case case case case case case case case case case case case case case case case case case case case case case VMI_BrushWireframe:return TEXT("BrushWireframe"); VMI_Wireframe:return TEXT("Wireframe"); VMI_Unlit:return TEXT("Unlit"); VMI_Lit:return TEXT("Lit"); VMI_Lit_DetailLighting:return TEXT("Lit_DetailLighting"); VMI_LightingOnly:return TEXT("LightingOnly"); VMI_LightComplexity:return TEXT("LightComplexity"); VMI_ShaderComplexity:return TEXT("ShaderComplexity"); VMI_QuadOverdraw:return TEXT("QuadOverdraw"); VMI_ShaderComplexityWithQuadOverdraw: return TEXT("ShaderComplexityWithQuadOverdraw"); VMI_PrimitiveDistanceAccuracy:return TEXT("PrimitiveDistanceAccuracy"); VMI_MeshUVDensityAccuracy:return TEXT("MeshUVDensityAccuracy"); VMI_MaterialTextureScaleAccuracy: return TEXT("MaterialTexturecaleAccuracy"); VMI_RequiredTextureResolution: return TEXT("RequiredTextureResolution"); VMI_StationaryLightOverlap:return TEXT("StationaryLightOverlap"); VMI_LightmapDensity:return TEXT("LightmapDensity"); VMI_LitLightmapDensity:return TEXT("LitLightmapDensity"); VMI_ReflectionOverride:return TEXT("ReflectionOverride"); VMI_VisualizeBuffer:return TEXT("VisualizeBuffer"); VMI_CollisionPawn:return TEXT("CollisionPawn"); VMI_CollisionVisibility:return TEXT("CollisionVis"); VMI_LODColoration:return TEXT("LODColoration"); VMI_HLODColoration:return TEXT("HLODColoration"); #UE4CEDEC
Show Console Command Show のエディタ設定版 #UE4CEDEC
今回紹介する3つのEditor機能 Viewmode #UE4CEDEC Show Statistics
Statistics シーンにおいてあるメッシュやテクスチャの情報を表で出してくれる #UE4CEDEC
Statistics #UE4CEDEC
Statistics Primitive Stats シーンのメッシュの統計情報を表示 何個シーンにある? #UE4CEDEC そのメッシュの ポリゴン数は? そのメッシュの シーン内の大きさは?
Statistics Texture Stats シーン内に読み込まれているテクスチャの統計情報を表示 #UE4CEDEC
Statistics (Primitive Stats) の半径を見て 不要に小さなオブジェクトがないかを探す #UE4CEDEC
Robがいるこのシーン、 RobのメッシュをPrimitive Statsで見てみる あきらかに小さいRobがいる。 #UE4CEDEC
草むらに小さなロブが沢山いた #UE4CEDEC
3つのEditor機能を紹介してきました Viewmode #UE4CEDEC Show Statistics
RenderDoc #UE4CEDEC
UE4.16から標準プラグインに #UE4CEDEC
RenderDocで何ができる? #UE4CEDEC
GPUのレンダリング工程を まるはだかにできる! ※Windows限定 #UE4CEDEC
EditorからのCapture ボタンひとつでCaptureを取ることができます #UE4CEDEC
Runtimeからのキャプチャ renderdoc.CaptureFrameでCaptureしてくれます。 #UE4CEDEC
RenderDoc の画面 #UE4CEDEC
Event Browser • 呼び出された命令を階層表示してくれる。 • このBrowserでDrawCallを選ぶ • この後説明するエディタで、 選んだDrawCallの詳細がわかる #UE4CEDEC
Texture Viewer • Input – そのDrawCallが使用 したテクスチャ一覧が • Output – そのDrawCallで出力 されたRenderTarget の一覧 #UE4CEDEC
Texture Viewer 選択したDrawCallまで描画してくれるので、Event ViewerでDrawCallを選 択していくことによって、描画の流れを理解することができる。 EID: 3536 次の DrawCall EID: 3559 #UE4CEDEC
Texture Viewer 選んだRenderTargetのピクセルの描画履歴を追うことが可能。 RenderTargetのみたいあたりに、右ボタンクリックで、Pixel Contextのズーム画面に。 更に正確には PixelContext画面で矢印キーで、ピクセルを選択 #UE4CEDEC
Mesh Output そのDrawCallで呼び出された そのメッシュが、画像のどのあたりにレンダリング されるのかも描画してくれる メッシュを描画してくれる VS Input #UE4CEDEC VS Output Texture Viewerと比較
Pipeline State • そのDrawCallの 各種設定などがわかる • 例えば、 – Depthの設定 – Rasterizerの設定 #UE4CEDEC
Pipeline State Shaderも見ることがきる。 #UE4CEDEC
Tips RenderDocでソースを見る方法 • r.Shaders.KeepDebugInfo=1 をConsoleVariables.iniに記述 • “-d3ddebug”オプションをエ ディタ起動 • シェーダコンパイルが再度すべ てに走るがRenderDocでソー スが見れるように #UE4CEDEC
RenderDocまとめ 1フレームの描画をキャプチャし、 – どんな順に – どんなオブジェクトが – どんなテクスチャ/シェーダで。。。 レンダリングしているかがわかる便利ツール ※Windows限定 #UE4CEDEC RenderDoc
本講演の目次 1. 2. 3. 4. 5. 6. はじめに 基本のプロファイリングツール 1 プロファイルの流れ 基本のプロファイリングツール 2 Showcase まとめ&おまけ #UE4CEDEC
Showcase #UE4CEDEC
Foliageのプロファイリングをデモしてみます (資料は別途公開します) #UE4CEDEC
本講演の目次 1. 2. 3. 4. 5. 6. はじめに 基本のプロファイリングツール 1 プロファイルの流れ 基本のプロファイリングツール 2 Showcase まとめ&おまけ #UE4CEDEC
まとめのまえに。。 #UE4CEDEC
各PlatformのProfiler #UE4CEDEC
各コンソールにもRenderDocみたいなのないの? PC #UE4CEDEC Console
各コンソールにもRenderDocみたいなのないの? PC Console PS4 Razor XBOX Pix などなど 各プラットフォームが用意してくれてます #UE4CEDEC
Q.プラットフォームのプロファイラを 使ったほうがいいの? A. (テクニカルよりの方ならば) 絶対使った方が良いです チートです #UE4CEDEC
プラットフォーム専用プロファイラのできること • RenderDocと同様の機能 (フレームのCapture&Replayシステム) • ハードウェアレベルのTrace機能 #UE4CEDEC
ハードウェアレベルのTrace機能でわかること テクスチャ 使いすぎ? 頂点多い? シェーダの計算 が重たい? その描画が重たい理由が一発でわかります #UE4CEDEC ピクセル 打ちすぎ?
ですが、それらを理解するためには、 こんなグラフを読み解く必要があります。 #UE4CEDEC Radeon GPU Profilerサイトより引用
さらに。。。 グラフを読み解くためには、 GPU構成をある程度理解する必要があります。 #UE4CEDEC 【後藤弘茂のWeekly海外ニュース】AMDの新GPUアーキテクチャ「Graphics Core Next」の秘密 - PC Watch
自習するのは大変そう。。。 #UE4CEDEC
プラットフォーム別のUE4勉強会を開催します! UE4ライセンシの方々には日程が決まり次第別途ご連絡いたします 勿論ですが、各プラットフォームのNDAライセンスをお持ちの方限定です 10月末、11月頭 東京大阪二箇所で開催 #UE4CEDEC 11月末or12月上旬 東京開催
まとめ #UE4CEDEC
本日の内容 UE4のプロファイリングツールを俯瞰で眺めながら、 UE4上でどのように プロファイルしていくのかを見ていきました #UE4CEDEC
グラフィクスプロファイル全体の流れ Step.1 Game? Draw? GPU? Stat unit / stat unit graph Draw Game Step.2 どの部分が重たい? Step.3 各処理のコマンドを 使って理由を調査 補助コマンド #UE4CEDEC Stat sceneredering Stat dumpframe… Light? Particle? Static Mesh? stat LightRendering, Foliage,,,, GPU profilegpu stat gpu Post Process? r.XXXXX, etc. show, freezerendering, toggledebugcamera, etc.
3つのEditor機能やプラグイン Viewmode #UE4CEDEC Show Statistics RenderDoc
なぜプロファイル? プロファイルしない最適化は危険 最適化の前に、開発初期から、日常的に、 実機で、 プロファイルする癖を #UE4CEDEC
本当に、本当にありがとうございました! 次回は10月8日のこの場所で! #UE4CEDEC