レベルにアセットを並べていったら、いつのまにか動きがカクつくようになった。とりあえずポストプロセスを弱めて、テクスチャ解像度を下げて、影の設定をいじってみる。それでも変わらない。
このとき起きているのは、原因が分からないまま対処している状態です。UE5には、重さの原因が CPUのゲームロジック・CPUの描画処理・GPU のどこにあるかを数秒で切り分けるコマンドがあります。この記事では、stat unit が表示する4つの数字の読み方と、そこから原因を絞り込んでいく手順を解説します。
この記事でわかること
- 体感で判断すると 見当違いの場所を直してしまう 理由
stat unitの Frame / Game / Draw / GPU が何を測っているか- 4つの数字から ボトルネックを判断する表
stat game/stat scenerendering/ GPU Visualizer への 掘り下げ- 実践:重いレベルを開いて、 犯人を特定して直すまで を1本通す
なぜ「まず測る」なのか
パフォーマンスの問題には、厄介な性質があります。 症状はどれも同じ「カクつく」なのに、原因はまったく違う場所にある ということです。
テクスチャを軽くしてもフレームレートが変わらないなら、そもそもボトルネックはテクスチャではありません。この状態で設定をいじり続けると、画質だけが下がって速度は元のまま、という結果になります。

もう1つ、最初に頭を切り替えておきたいのが 単位 です。パフォーマンスの話ではFPS(1秒あたりのコマ数)よりも、 フレームタイム(1コマにかかった時間・ミリ秒) で考えます。
| 目標FPS | 許される1フレームの時間 |
|---|---|
| 30 FPS | 33.3 ms |
| 60 FPS | 16.6 ms |
| 120 FPS | 8.3 ms |
FPSで見ると誤解が起きます。120FPSから60FPSへ落ちるのも、40FPSから30FPSへ落ちるのも、どちらも 8.3ミリ秒の悪化 で、負荷としては同じ大きさです。「FPSが半分になった」と「FPSが10しか下がっていない」は、体感ほど差がありません。ミリ秒で見ると、この2つが同じ規模の出来事だと分かります。
だから計測コマンドは、FPSではなくミリ秒を表示します。 足し引きできる単位で見る ためです。
stat unit:4つの数字の意味
プレイ中にコンソール(既定では ` キー)を開き、stat unit と入力します。画面右上に数字が並びます。
コンソールが開かないとき: 日本語キーボードでは半角/全角キーと干渉して開けないことがあります。
Project Settings → Engine → Input → ConsoleのConsole Keysにキーを追加してください。

| 項目 | 測っているもの | 誰が働いているか |
|---|---|---|
| Frame | 1フレーム全体にかかった時間 | 全体の結果 |
| Game | Blueprint・C++・AI・物理などのゲームロジック | CPU(ゲームスレッド) |
| Draw | 「これを描いて」とGPUに指示を出す処理 | CPU(描画スレッド) |
| GPU | 実際にピクセルを塗る処理 | GPU |
ここでいちばん誤解されやすいのが Draw です。Drawは「描く時間」ではなく、 CPUが描画命令を組み立てて渡す時間 です。実際に描くのはGPUで、そちらは GPU に出ます。オブジェクトを1000個置いたときにDrawが伸びるのは、GPUが疲れているからではなく、CPUが1000回分の指示書を書いているからです。
そしてもう1つ、この3つは 同時に走っています 。UEはゲームスレッド・描画スレッド・GPUをパイプライン処理していて、GPUが今のフレームを塗っている間に、ゲームスレッドは次のフレームを計算しています。
だから Frameは3つの合計ではありません 。3つのうちいちばん遅いものに引きずられて決まります。Game 5ms / Draw 4ms / GPU 15ms なら、Frameは24msではなく15ms強になります。 列で並んだ処理の速度は、いちばん遅い担当者が決める わけです。