Note ! 本記事は公開から1年以上経過しています。

  • stat unit などコンソール統計の意味はレンダリングパス(Deferred / Lumen 等)で解釈が変わります。版ごとの説明を確認してください。
  • 閾値の「良し悪し」はプロジェクト規模とターゲット FPS に依存します。記事は入門向けの目安です。
  • ボトルネック特定には Unreal Insights 等のプロファイラ併用が推奨です。

UE5にて動作がカクツクとき、何が原因で負荷が発生しているのか調べる必要があります。

本記事では統計データであるstat unitの項目の読み方、統計データから負荷ボトルネックを特定する基本、統計データの毎回自動表示する方法を説明します。 動作のボトルネック調査の第一歩は「stat unit」など統計データです。コンソールに「stat unit」を入力する方法もありますが、①画面の左上のメニューをクリックします。②統計データ、③Engine、④FPSにチェック、⑤UnitとUnitGraphにチェックを入れます。簡単な方をお使いください。 右側に細かい数字が出てきます。Frame、Game、Draw、RHIT、GPU time、DynRes、Draws、Primsなどの項目です。 これら数字からゲームスレッド(ゲームロジックやプレイヤーの入力処理など)、レンダリングスレッド(3Dモデルのレンダリング、テクスチャの適用、シェーダーの計算、光源の処理など)、またはGPUのいずれかにパフォーマンスのボトルネックがあるか判別に役立ちます。 公式の説明

Unreal Engine公式:Stat Unitの計測項目https://dev.epicgames.com/documentation/en-us/unreal-engine/stat-commands-in-unreal-engine#unit

Frame(フレーム) フレーム時間は、ゲームの1フレームを生成するのにかかった総時間です。ゲームスレッドと描画スレッドはフレームを終える前に同期するため、フレーム時間はこれらのスレッドのいずれかの表示時間に近くなることが多いです。

Game(ゲーム:) フレーム時間がゲーム時間に近い場合、ゲームのパフォーマンスはおそらくゲームスレッドによってボトルネック(負の影響を受けている)になっています。

Draw(描画) フレーム時間が描画時間に近い場合、ゲームのパフォーマンスはおそらくレンダリングスレッドによってボトルネックになっています。

GPU time(GPU時間) デオカードがシーンをレンダリングするのにかかる時間を測定します。GPU時間はフレームに同期されているため、フレーム時間と似たようなものになる可能性が高いです。

RHIT RHIスレッド時間はフレームに同期され、フレーム時間と似ている可能性が高いです。

DynRes サポートされている場合(および有効になっている場合)、動的解像度は主画面のパーセンテージを副画面のパーセンテージで表示します。

以下画面の一番上に数値が、このプロジェクトの実際のfpsです。60fps出るはずが、何かがボトルネックになっており、48fpsしか出ていません。何がボトルネックなのでしょうか。

まずフレーム時間とゲームスレッドの比較

フレーム時間がゲーム時間に近い場合、それはゲームスレッドがパフォーマンスのボトルネックになっている可能性が高いです。ゲームスレッドは、ゲームロジック、AIの計算、物理演算などを処理します。この時間が全体のフレーム時間に占める割合が大きい場合、ゲームスレッドの最適化が必要です。 実際に以下を見ると、FrameとGameは近くないので、ゲームスレッドがボトルネックではないと判断できます。

フレーム時間と描画スレッドの比較

フレーム時間が描画時間に近い場合、描画スレッドがボトルネックであることを示します。描画スレッドは、3Dモデルのレンダリング、テクスチャのマッピング、シェーダーの適用など、画面に表示するための計算を行います。この時間がフレーム時間に占める割合が大きければ、描画関連の最適化が求められます。 実際に以下を見ると、FrameとDrawはとても近いです。レンダリングスレッドがボトルネックになっている可能性が高いです。

GPU時間の確認(GPU time)

GPU時間もフレーム時間と同様に、グラフィックカードがシーンをレンダリングするのにかかる時間です。GPU時間がフレーム時間に近い場合、GPU処理がボトルネックとなっている可能性があります。

RHIスレッドの時間(RHIT)

RHI(Render Hardware Interface)スレッドは、レンダリングを制御するための低レベルAPIと通信します。この時間がフレーム時間に近い場合、レンダリングAPIの呼び出しに問題がある可能性が指摘されます。以下は近くないので問題がなさそうです。

動的解像度の監視(DynRes)

無効になっていますが動的解像度が有効な場合、パフォーマンスを維持するために解像度が動的に変更されます。この設定の有効化とその効果もパフォーマンス分析に重要です。

毎回自動でエディタに統計データを表示する方法

エディタを再起動すると表示が消えてしまいます。消えないようにする方法はエディタの環境設定から、ビューポート、ルック&フィール、エンジン統計の保存をクリックします。これでエディタを再起動しても再表示されます。

アプリで書き出したり実行しながら統計データを確認

簡易なプレビューではなく、実際にアプリで書き出した時にも統計データをチェックしたいことがあります。

実際に操作するとまた挙動が異なるものです。

ブループリントにて、stat unitが実行されるようにします。

Execute Console Commandを設定して、そこにstat unitなど統計データのコマンドを入力します。

riragonの記事はここまで。以下deepサーチ検索結果です。本記事で発見できない項目など見つかるかもしれません。AI検索のよいところは、知りえなかった情報が見つかることです。

もっと深堀してみよう!

UE5においてstat unitの項目の詳細な読み方、ボトルネックの特定方法、および関連する統計データについて調査します。また、パッケージ化後の実行やVR環境での最適化に関する情報、ハードウェアの影響、および効果的な最適化手法についても調査し、包括的にまとめます。

UE5におけるパフォーマンス計測とボトルネック分析

1. stat unit各項目の意味とボトルネックの見分け方

Unreal Engine 5では、コンソールコマンドstat unitを実行するとフレーム時間の内訳が表示されます。表示される主な項目は「Frame」「Game」「Draw」「GPU」「RHIT」「Present」です。それぞれの意味は以下の通りです。

以上の項目の中で最も時間のかかっている部分がボトルネックです。

実際のFrame時間は、Game・Draw・GPUのいずれか遅い方によって決まります。

Epicフォーラム:Stat UnitGraphのFrame・Game・Drawの意味https://forums.unrealengine.com/t/meaning-of-frame-game-draw-when-using-stat-unitgraph/317239#:~:text=%E2%80%9CThe%20actual%20frame%20time%20is,%E2%80%9D

したがって、stat unitを見てFrameとほぼ同じ値を示している項目がボトルネック要因であり、そのスレッドないしデバイス(CPUゲーム処理・CPU描画処理・GPU)の最適化が必要になります。

VRealMatic:Unreal Engineの計測・最適化ガイドhttps://vrealmatic.com/unreal-engine/profiling#:~:text=Frame%20The%20total%20amount%20of,bottlenecked%20by%20the%20Rendering%20Thread

例えば「Game: 25ms, Draw: 5ms, GPU: 4ms, Frame:25ms」であればCPUのゲームロジックが足かせになっており、「GPU: 30ms, Game:10ms, Frame:30ms」であればGPUがボトルネックだと判断できます。

2. stat unit関連の統計データ活用方法 (stat fps, stat gpu, stat scene renderingなど)

パフォーマンスを詳しく分析するには、stat unit以外にもUnreal Engineの各種統計コマンドを組み合わせて使います。それぞれの用途と読み取り方は以下の通りです。

これらの統計コマンドを組み合わせることで、まずCPUとGPUのどちらにボトルネックがあるか把握し(stat unit)、次に問題の詳細を深掘りできます。

Epicフォーラム:パフォーマンスのボトルネックを調べるhttps://forums.unrealengine.com/t/understanding-performance-bottlenecks/138195#:~:text=start%20by%20running%20%E2%80%98stat%20unit%E2%80%99,to%20understand%20if%20it%E2%80%99s%20your

例えば「GPUがボトルネックだ」と判明したらstat gpuでどの描画処理に時間がかかっているか調べたり、「CPUのGameが重い」場合はstat gameやUnreal Insightsでゲームコード中の重い関数を探す、といった流れです。

Epicフォーラム:パフォーマンスのボトルネックを調べるhttps://forums.unrealengine.com/t/understanding-performance-bottlenecks/138195#:~:text=start%20by%20running%20%E2%80%98stat%20unit%E2%80%99,to%20understand%20if%20it%E2%80%99s%20your

またstat sceneRenderingの情報(Draw Call数やライティング負荷など)は、シーンの設計レベルでの最適化ポイント(オブジェクト数削減やライト設定の見直し)を考える材料になります。

Outer Spaceフォーラム:Unreal Engineの性能と計測項目の議論https://forum.outerspace.com.br/index.php?threads/amd-lan%C3%A7a-hoje-patch-especifico-para-unreal-engine-4-seu-calcanhar-de-aquiles-ser%C3%A1-que-a-partir-de-agora-vai-w.560116/#:~:text=,cost%2C%20draw%20call%20count%2C%20etc

補足として、stat startfile/stat stopfileコマンドで統計情報をログに記録し、Session FrontendやUnreal Insightsで詳細解析する方法もあります(後述)。

VRealMatic:Unreal Engineの計測・最適化ガイドhttps://vrealmatic.com/unreal-engine/profiling#:~:text=Recording%20performance%20metrics

VRealMatic:Unreal Engineの計測・最適化ガイドhttps://vrealmatic.com/unreal-engine/profiling#:~:text=Session%20Frontend%20Viewer

短時間の統計をファイル出力し、後からグラフ表示や詳細な関数単位の分析が可能です。

3. パッケージ化後の実行時におけるパフォーマンス計測と問題特定

エディタ上での計測だけでなく、実際にパッケージ化したビルド(実行ファイル)上でパフォーマンスを測定することは非常に重要です。

理由として、エディタでは各種オーバーヘッドやエディタ専用処理があるため、実行性能やメモリ使用量が実ビルドと異なる場合があるからです。

実際、「エディタでの実行」と「パッケージ後の実行」ではメモリ使用量が大きく異なったり、ストリーミングによるスタッター(カクつき)の発生状況が変わることがあります。

Tom Looman:Unreal Engineのゲーム最適化講演https://www.tomlooman.com/unrealengine-optimization-talk/#:~:text=Ideally%2C%20when%20profiling%20with%20tools,%E2%80%98Realtime%E2%80%99%20disabled%20and%20is%20minimized

そのため最終的なパフォーマンス検証はパッケージビルドで行うのが望ましく、エディタ上で得た最適化策もパッケージ版で効果を確認する必要があります。

Tom Looman:Unreal Engineのゲーム最適化講演https://www.tomlooman.com/unrealengine-optimization-talk/#:~:text=Ideally%2C%20when%20profiling%20with%20tools,%E2%80%98Realtime%E2%80%99%20disabled%20and%20is%20minimized

パッケージビルド上で統計情報を確認する方法:

  • 開発ビルドでのコンソール使用: パッケージ作成時にDevelopmentビルドまたはDebugビルドを選択すると、実行時にチートコマンドやコンソールが有効な状態でゲームを起動できます。その状態でゲーム中に~キー(または適宜設定したキー)でコンソールを開き、エディタ同様にstat unitやstat fps等のコマンドを実行すれば、オンスクリーンにパフォーマンス指標を表示できます。これによりパッケージ後でもリアルタイムな計測が可能です。ただしShippingビルド(出荷用ビルド)ではデフォルトでコンソールやstatコマンドが無効になる点に注意が必要です(本番用ではチートが使えなくなるため)。最終的な製品ビルドではなくパフォーマンス解析が目的であれば、Developmentビルドで実行するか、あるいはDefaultEngine.iniに一時的に設定を入れてコンソールを有効化するとよいでしょう。

    Epicフォーラム:Shippingビルドのプロファイリングhttps://forums.unrealengine.com/t/how-to-profile-shipping-build/1935213#:~:text=How%20to%20profile%20Shipping%20build%3F,out%20console%20commands%2C%20stats

  • 統計ファイルの記録 (stat startfile): ゲーム実行中にコンソールからstat startfileコマンドを入力すると、そこからstat stopfileを実行するまでの間、詳細なパフォーマンス統計をファイルに記録できます。記録が終了すると、プロジェクトのSaved/Profiling/UnrealStats/フォルダに拡張子.ue4statsのファイルが出力されます。このファイルをエディタの「Session Frontend」(Window → Developer Tools → Session Frontend)で開くか、あるいはUnreal Insightsツールでロードすると、記録されたCPU・GPU各スレッドの詳細なプロファイルを解析できます。これによりパッケージ実行環境で発生しているボトルネックを後からじっくり分析可能です。Unreal InsightsはUE4後期~UE5で導入された強力なプロファイリングツールで、スタンドアロン実行されたゲームにもアタッチしてトレースを取得できます(例えばコマンドライン引数に-trace=cpu,render,gpu等を付与して起動し、Insightsで接続)。パッケージ版で再生中の動作を記録しておけば、あとでエディタに戻って詳しくボトルネック原因を調査できるわけです。

    VRealMatic:Unreal Engineの計測・最適化ガイドhttps://vrealmatic.com/unreal-engine/profiling#:~:text=Recording%20performance%20metrics

    VRealMatic:Unreal Engineの計測・最適化ガイドhttps://vrealmatic.com/unreal-engine/profiling#:~:text=%2A%20%60stat%20startfile%60%20,to%20stop%20record%20the%20data

    VRealMatic:Unreal Engineの計測・最適化ガイドhttps://vrealmatic.com/unreal-engine/profiling#:~:text=Session%20Frontend%20Viewer

  • ターゲットプラットフォーム固有のツール: 場合によっては、プラットフォーム固有のプロファイラも役立ちます。例えばモバイル向けにパッケージした場合はAndroidのSystraceやGPUベンダー提供のツール、コンソール機では各社の開発者ツールを用いてCPUやGPUの使用率、描画コール数、メモリ使用量などを計測する方法もあります。しかし一般的なPC環境であれば、前述のUnreal Engine標準のstatファイル+Insightsで十分詳細な情報が得られます。

パッケージ実行時の問題特定ポイント: エディタ実行との違いに注目しましょう。

例えばエディタでは問題なかったのにパッケージ後に急にFPSが低下する場合、エディタでは無効化されていたフルスクリーン独自の負荷や、ビルド設定によって有効になった機能(例: LumenのQualityレベル差異)などが影響している可能性があります。

またロード時のカクつきはパッケージ時に顕在化しやすい問題です。

エディタではすでにロード済みだったアセットも、パッケージ環境ではディスクから読み込むため、ストリーミング負荷が直接体感されます。

このようなストレージやメモリ起因のボトルネックは、統計ファイルをとってLoadTimeやFile I/Oイベントを解析したり、ログ出力(例えば log LogContentPolling や log LogStreaming)から診断できます。

Tom Looman:Unreal Engineのゲーム最適化講演https://www.tomlooman.com/unrealengine-optimization-talk/#:~:text=Ideally%2C%20when%20profiling%20with%20tools,%E2%80%98Realtime%E2%80%99%20disabled%20and%20is%20minimized

Tom Looman:Unreal Engineのゲーム最適化講演https://www.tomlooman.com/unrealengine-optimization-talk/#:~:text=,full%60%20%2A%20%60loadtimes.dumpreport

特定のタイミングでFrameが跳ね上がる場合、その前後で「どのファイルを読み込んでいたか」「GC(ガベージコレクション)は走っていないか」などを調べることで原因を突き止められます。

4. VR環境でのボトルネック特定と最適化ポイント

VR(仮想現実)向けアプリケーションでは、非常に高いフレームレート(90FPSや120FPSなど)と低遅延が要求されるため、通常のゲーム以上にボトルネックの把握と最適化が重要です。

またHMD(ヘッドマウントディスプレイ)向けでは両目分の描画が必要で処理負荷が増える点にも注意する必要があります。

以下にVR特有のボトルネック診断法と最適化ポイントをまとめます。

● ボトルネックの診断(CPU or GPU): 基本的な手順は通常のケースと同じく、まずstat unitでCPUとGPUのどちらに余裕がないかを確認します。

Epicフォーラム:パフォーマンスのボトルネックを調べるhttps://forums.unrealengine.com/t/understanding-performance-bottlenecks/138195#:~:text=start%20by%20running%20%E2%80%98stat%20unit%E2%80%99,to%20understand%20if%20it%E2%80%99s%20your

VRでは特にGPU負荷がボトルネックになりやすい傾向があります。

高解像度で両目分のレンダリングを行うため、ピクセル描画量が膨大になりがちだからです。

一方で、CPU側もVR固有のオーバーヘッド(例: 両目分の描画コール、トラッキングデバイスの更新など)はありますが、GPUに比べればボトルネックになるケースは少なめです。

いずれにせよ、Game・Draw・GPUの値を確認し、どれがフレーム時間を占有しているかで判断します。

もしGPU時間がFrameと同程度ならGPUボトルネック、GameまたはDrawが長ければCPU側のボトルネックです。

  • GPUがボトルネックの場合、stat gpuでどのレンダリングパスが時間を食っているか詳しく確認します。VRではピクセル描画負荷が高い(=シェーダやポストプロセスが重い)か、ジオメトリ描画負荷が高い(=描画物が多すぎる)かを切り分けることが大切です。ひとつの手法として、極端にレンダリング解像度を下げてみるというものがあります。例えばvr.PixelDensity 0.5(もしくはr.ScreenPercentageで50%程度に解像度縮小)を一時的に適用すると、それまでGPUがピクセル処理に費やしていた時間が大幅に減少します。もしこの操作でフレームレートが大きく向上するなら、ピクセルシェーダ/描画解像度寄りの負荷がボトルネックだったことが示唆されます。一方、解像度を下げてもフレームレートがほとんど変わらない場合、ジオメトリやCPU側の負荷が支配的である可能性が高いです。このようにしてボトルネックの性質を掴んだ上で、次の最適化策を講じます。

    GitHub:authorTomのVRパフォーマンス最適化ノートhttps://github.com/authorTom/notes-on-VR-performance#:~:text=To%20determine%20whether%20the%20performance,rendered%20while%20maintaining%20the%20complexity

● VRパフォーマンス最適化の主なポイント:

5. ハードウェア要因とそれぞれのボトルネック判別方法

パフォーマンスのボトルネックは大きくCPU、GPU、メモリ、ストレージのどこに起因するかに分類できます。それぞれの典型的な症状と見分け方を整理します。

6. 効果的な最適化手法

ボトルネックが特定できたら、それに対処するための最適化を行います。Unreal Engineで効果的な最適化手法には大きくエンジン設定の調整、アセット(コンテンツ)の最適化、コードやアルゴリズムの最適化の3つがあります。それぞれ具体的な施策を以下に提案します。

以上、UE5におけるstat unitの読み取り方から始まり、関連統計コマンドの活用、ビルド後の計測方法、VR特有の留意点、ハードウェア別の診断と最適化手法について詳しく解説しました。

ボトルネックを正しく特定し、適切な対策を講じることで、フレームレートの向上と安定化が図れるでしょう。

ゲームの規模やターゲットプラットフォームに応じて最適な手法を選び、快適な体験を提供できるよう最適化を進めてください。

各種ツール(Unreal Insights等)や統計コマンドを駆使して分析を行い、ボトルネックに対処することが、UE5で高性能なコンテンツを制作する鍵となります。

参考資料: Epic Games 公式ドキュメントおよびコミュニティフォーラム、Unreal Engineパフォーマンスガイド、有志による技術ブログ記事など.

AMD GPUOpen:Unreal Engineパフォーマンスガイドhttps://gpuopen.com/learn/unreal-engine-performance-guide/#:~:text=

AMD GPUOpen:Unreal Engineパフォーマンスガイドhttps://gpuopen.com/learn/unreal-engine-performance-guide/#:~:text=

Unreal Art Optimization:パフォーマンス計測の解説https://unrealartoptimization.github.io/book/process/measuring-performance/#:~:text=We%20can%20get%20more%20specific,is%20shown%20as%204%20numbers

Outer Spaceフォーラム:Unreal Engineの性能と計測項目の議論https://forum.outerspace.com.br/index.php?threads/amd-lan%C3%A7a-hoje-patch-especifico-para-unreal-engine-4-seu-calcanhar-de-aquiles-ser%C3%A1-que-a-partir-de-agora-vai-w.560116/#:~:text=,if%20dynamic%20resolution%20is%20enabled