木を1本置いたときは軽かったのに、3,000本並べたら重くなった。stat unit で測ったら Draw がいちばん大きい。この状態は、CPUが毎フレーム3,000回分の描画指示を書いている状態です。
ここで効くのが 描く量そのものを減らす という発想です。遠くのものは粗く描き、画面の外や物陰にあるものはそもそも描かない。この記事では、LOD・フラスタムカリング・オクルージョンカリング・距離カリングの4つを整理し、それぞれが stat unit のどの数字に効くかまで解説します。
この記事でわかること
- 4つの技術に共通する発想= 見えないもの・遠いものは手を抜く
- LOD の設定と、切り替え距離の調整
- フラスタムカリング と オクルージョンカリング (どちらも自動)
- Cull Distance Volume で距離を切る
Freeze Rendering(Ctrl + Shift + O)で カリングの効き目を目で見る- 実践:木を3,000本 並べたシーンで Drawを減らす
共通する発想:全部を真面目に描かない
前の記事 stat unitで重さの原因を特定する で、Draw は「CPUが描画命令を組み立てる時間」だと確認しました。この数字は、 描画対象の数 にほぼ比例して増えます。
だから減らし方は2通りしかありません。 描く対象の数を減らす か、 1つあたりを軽くする かです。

| 技術 | やること | 主に効く数字 | 自動か |
|---|---|---|---|
| LOD | 遠いものを簡略なメッシュに差し替える | GPU(三角形が減る) | 設定が必要 |
| フラスタムカリング | カメラの視野外を除外する | Draw | 自動 |
| オクルージョンカリング | 物陰に隠れたものを除外する | Draw | 自動(PC/コンソール) |
| 距離カリング | 一定距離より遠いものを除外する | Draw | 設定が必要 |
自分で手を入れる余地があるのは、実質 LODと距離カリングの2つ です。残り2つはエンジンが勝手にやってくれているので、「効いているかどうかを確認する」のが仕事になります。
LOD:遠くのものを粗く描く
LOD(Level of Detail)は、 カメラからの距離に応じて、簡略なメッシュに差し替える 仕組みです。遠くの木が10,000三角形である必要はありません。画面上で20ピクセルにしかならないなら、500三角形でも見た目は変わりません。

生成する
Static Mesh Editorを開き、右側の詳細パネルにある LOD Settings を使います。
Number of LODsに段数を入力します(背景アセットなら3〜4段が目安)Apply Changesを押すと、エンジンが元メッシュから簡略版を自動生成します
もっと手軽なのは LOD Group です。SmallProp や LargeProp といったプリセットを選ぶだけで、そのカテゴリに合った段数と距離が一括で設定されます。個別に詰める前に、まずここから試すのが早道です。
切り替え距離を調整する
各LODには Screen Size という値があります。これは距離そのものではなく、 そのメッシュが画面上で占める大きさの割合 です。Screen Size が 0.25 なら、画面の縦横のおよそ4分の1を占める大きさまで縮んだところで、次のLODへ切り替わります。
距離ではなく画面占有率を基準にしているのは、画角や解像度が変わっても破綻しないためです。
| アセットの性格 | 方針 |
|---|---|
| プレイヤーが近くでじっと見るもの(武器、主要キャラの装備) | LOD0を長く維持する(次の Screen Size を小さめに) |
| 大量に置く背景(岩、木、 瓦礫) | 早めに切り替える(Screen Size を大きめに) |
確認する
いま何段目のLODが表示されているかは、目で見て確認できます。ビューポート左上の View Mode(既定は Lit)から Level of Detail Coloration → Mesh LOD Coloration を選ぶと、LOD段数ごとに色分けされます。カメラを前後に動かして、色が切り替わる距離が意図どおりか確かめてください。
カリング:そもそも描かない
LODが「粗く描く」なら、カリングは 「1ミリ秒も使わない」 方です。効果としてはこちらの方が大きく、そして大半が自動で動いています。

フラスタムカリング
カメラの視野(視錐台=フラスタム)の外にあるものを描かない 処理です。UEが常時、自動で行っています。
開発者が設定することはほとんどありませんが、1つだけ知っておくと役立つ事実があります。判 定は メッシュそのものではなく、そのアクターのバウンズ(境界ボックス) で行われます。バウンズが不自然に大きいアクターは、画面外に出てもカリングされません。マテリアルで World Position Offset を使ったときなどに、バウンズを手動で広げるとこれが起きます。
オクルージョンカリング
手前の物に完全に隠されているものを描かない 処理です。壁の裏、建物の中、地形の向こう側。ここにあるオブジェクトの描画コストがゼロになります。
PCとコンソール向けのUE5では、GPUを使った ハードウェアオクルージョン(Hierarchical Z-Buffer) が既定で有効です。特別な設定は要りません。Project Settings → Engine → Rendering → Culling の Occlusion Culling にチェックが入っていることだけ確認しておけば十分です。
ただし、性質上のクセが2つあります。
- 1フレーム遅れる: 前のフレームの深度情報をもとに判定するため、カメラを高速で振ると一瞬だけ描かれてしまうことがあります
- 判定にもコストがある: オブジェクトが数万個ある状態では、オクルージョン判定そのものが
Drawに乗ってきます。この段階に来たら、距離カリングやインスタンス化を併用します
モバイル向けには、CPUで計算する ソフトウェアオクルージョン が別に用意されています。こちらを使う場合は、遮蔽物になるメッシュに LOD for Occluder Mesh を設定して、判定用の簡略メッシュを指定します。
遮蔽する物を大きく作る ことは、意識する価値があります。細かい柱をたくさん並べるより、1枚の大きな壁の方が、後ろにあるものをまとめて隠せます。レベルデザインの段階で「視線を遮る大きな面」を配置しておくと、それだけで描画対象が大きく減ります。
Cull Distance Volume:距離で切る
自動のカリングでは足りないとき、 「この距離より遠いものは描かない」 と明示的に決められます。方法は2つです。
個別に設定する場合 は、アクターを選んで詳細パネルの Rendering セクションにある Desired Max Draw Distance に距離(Unreal Unit、1uu = 1cm)を入れます。10,000 と入れれば100メートル先で消えます。
まとめて設定する場合 は、Place Actors パネルから Cull Distance Volume をレベルに配置します。このボリュームが囲む範囲のアクターに対して、 サイズに応じたカリング距離 を一括で適用できます。

ボリュームの詳細パネルにある Cull Distances は、Size と Cull Distance のペアの配列です。
| Size(オブジェクトの大きさ) | Cull Distance(この距離で消える) |
|---|---|
| 100 | 3,000 |
| 500 | 10,000 |
| 2000 | 30,000 |
エンジンは各アクターのバウンズの大きさを見て、この表から近い行を選びます。 小さい物ほど手前で消え、大きい物は遠くまで残る という設定が、1つのボリュームで実現できます。地面に落ちている小石が100メートル先で消えても誰も気づきませんが、山が消えたら分かります。この直感をそのまま表にしたのがCull Distance Volumeです。
距離を詰めすぎると、 歩いているだけで前方に物が湧いて出る(ポップイン) ことになります。実際に歩き回って、気になったら距離を伸ばす。この往復で決めるのが現実的です。
Freeze Rendering:カリングを目で見る
カリングの困った点は、 効いているかどうかが画面から分からない ことです。ちゃんと除外されていても、見えていないのだから見た目は同じです。
これを覗く仕掛けが Freeze Rendering です。プレイ中に Ctrl + Shift + O を押すと、 その瞬間の描画対象リストが凍結 されます。コンソールで FreezeRendering と打っても同じです。

凍結したままカメラを後ろへ引くと、 凍結時に描画対象だったものだけが残り、それ以外は空白 になります。壁の裏にあったオブジェクトが、まるごと消えているのが見えるはずです。これがオクルージョンカリングの実際の効き目です。
もう一度 Ctrl + Shift + O を押すと解除されます。
数字で確認したいときは stat initviews です。1フレームで何個のプリミティブが処理され、そのうち何個がフラスタムとオクルージョンで除外されたかが出ます。 Frustum Culled Primitives と Occluded primitives の数を見て、除外されている割合が低ければ、遮蔽物の配置か距離カリングを見直す段階です。
Naniteとの関係
UE5では Nanite が、この話の一部を肩代わりします。ただし「全部を置き換える」わけではありません。ここを取り違えると設定が抜けます。
| 項目 | Naniteが面倒を見るか |
|---|---|
| Static MeshのLOD | 見る(手動のLOD作成が不要になる) |
| Skeletal MeshのLOD | 5.5以降で対応が進んだが、 従来のLODが現役 |
| 半透明マテリアルのメッシュ | 見ない(Nanite非対応。LODが必要) |
| フラスタムカリング | 見る(Nanite内部でクラスタ単位のカリングを行う) |
| オクルージョンカリング | 見る(同上) |
| Cull Distance Volume / 描画距離 | 見ない 。表示距離は自分で決める |
つまり Nanite化しても、距離カリングの判断は自分の仕事のまま です。そしてキャラクターや草木(半透明・マスク)には従来のLODが必要です。Naniteの仕組みと制限は Naniteでハイポリメッシュを扱う で詳しく扱っています。
実践:木を3,000本並べてDrawを減らす
オープンワールドの森、RTSの広いマップ、サバイバルゲームの拠点。 同じアセットを大量に並べる 場面はどのジャンルにもあります。ここでは重い森を作り、Drawを実際に下げるまでを通します。

再現条件を作る
| 項目 | 設定 |
|---|---|
| レベル | File → New Level → Basic |
| 配置するメッシュ | 三角形 8,000程度 のStatic Mesh 1種(LODなし・Naniteオフの状態から始める) |
| 個 数 | 3,000個 |
| 配置範囲 | 半径 20,000uu(200メートル)の円内にランダム配置 |
配置はレベルブループリントの BeginPlay から Spawn Actor from Class を3,000回ループするのが早いです。Naniteは意図的にオフのままにしてください(オンにすると、この記事の効果が見えなくなります)。
ステップ1:現状を測る
Standalone Game で起動し、森が視界に入る位置で stat unit を実行します。
Frame: 15.10 ms
Game: 2.30 ms
Draw: 14.62 ms
GPU: 9.80 ms
Draw の 14.62ms が最大です。CPUが3,000回分の描画命令を書いている状態で、まさに 描く対象が多すぎる 症状です。
続けて stat scenerendering を実行し、Mesh draw calls の数を控えておきます。3,000前後になっているはずです。
ステップ2:LODを追加する
Static Mesh Editorでそのメッシュを開き、LOD Settings の Number of LODs を 4 にして Apply Changes を押します。
Standalone Game で測り直します。
Frame: 11.20 ms
Game: 2.28 ms
Draw: 14.10 ms
GPU: 4.90 ms
GPU が 9.80ms から 4.90ms へ半減 しました。遠くの木が簡略メッシュに置き換わり、塗る三角形が減ったからです。
一方で Draw はほとんど変わっていません (14.62 → 14.10ms)。LODは三角形を減らしますが、 描画命令の数は減らさない からです。木は依然として3,000本、全部が描画対象のままです。ここがLODの限界で、次の手当てが要る理由です。
ステップ3:Cull Distance Volumeを置く
Place Actors パネル(Window → Place Actors)で「Cull」と検索し、 Cull Distance Volume をレベルにドラッグします。
ボリュームを森全体が入る大きさに拡大し(Brush Settings の X / Y / Z をそれぞれ 45,000 程度)、詳細パネルの Cull Distances に次の1行を設定します。
| Size | Cull Distance |
|---|---|
| 500 | 12000 |
木のバウンズがおよそ500uuなので、 120メートル先で描画対象から外れる 設定です。
もう一度 Standalone Game で測ります。
Frame: 6.40 ms
Game: 2.25 ms
Draw: 5.14 ms
GPU: 3.60 ms
Draw が 14.62ms から 5.14ms へ落ちました。stat scenerendering の Mesh draw calls も、3,000前後から1,000前後へ減っているはずです。Frameは15.10msから6.40msになり、60FPSどころか150FPS相当まで戻りました。
ステップ4:効き目を目で確かめる
森の中央でプレイ中に Ctrl + Shift + O を押し、そのままカメラを真上へ引いてください。 120メートルより外の木が、まるごと存在しない 状態が見えます。これがいま Draw を9ミリ秒ぶん節約している中身です。
その後、実際にプレイヤーを歩かせてみてください。前方に木が湧いて見えるなら、Cull Distance を 15000、18000 と伸ばして、気にならない距離を探します。
うまくいかないときの切り分けです。
Drawが下がらない → Cull Distance Volume が木を囲めていません。ボリュームのサイズを確認してください。カリング対象になるのは ボリュームの内側にあるアクター です- 木が全部消えた →
Cull Distanceが小さすぎるか、Sizeの行が木のバウンズと合っていません。まずSizeを 0 にした行(=すべてに適用)で試すと切り分けやすいです GPUが下がらない → LODが生成されていません。Mesh LOD Colorationで色が変わるか確認してください- Freeze Renderingが効かない → エディタのビューポートではなくPIEかStandaloneで実行しているか確認してください
ポイントは2つです。
- LODはGPU、カリングはDrawに効く: この対応を覚えておくと、
stat unitの結果から打つ手が決まります。GPUが高いならLODとマテリアル、Drawが高いならカリングとインスタンス化。上の実践では、片方だけでは9ミリ秒は落ちませんでした - カリング距離は歩いて決める: 数字上はいくら短くしても得ですが、ポップインは没入感を壊します。数値で詰めたあと、必ず実際に歩いて確認してください
Draw をさらに詰めるなら、同じメッシュを1回の命令でまとめて描く Instanced Static Mesh や Hierarchical Instanced Static Mesh が次の手です。そして「そもそもレベルに読み込まない」という別方向の解決は レベルストリーミングとWorld Partition で扱います。
おまけ:先に知っておくと良いこと
同じメッシュを大量に置くなら、まとめて描ける。 木や岩のように 同じメッシュを何百・何千と置く 場合は、描画命令を1回にまとめる手があります(→ Instanced Static Meshで描画コールを減らす)。カリングと併用できます。
マテリアルスロットの数だけ描画命令が増えます。 1つのメッシュに5つのマテリアルスロットがあれば、それは5回の描画命令です。背景アセットをモデリングする段階でスロットをまとめておくと、Draw に効きます。3,000本の木のスロットを2つから1つに減らせば、それだけで描画命令が3,000回減ります。
影も描画対象です。 動的ライトが影を落とすオブジェクトは、影を描くためにもう一度描かれます。遠くのオブジェクトの Cast Shadow を切る、あるいはライトの Dynamic Shadow Distance を絞ると、見た目をほとんど変えずに負荷が下がります。
LODは自動生成でも十分なことが多いです。 背景アセットについては、エンジンの Apply Changes で作られたLODで実用に耐えます。手作業でLODメッシュを用意する価値があるのは、シルエットが崩れると目立つもの(建物のよ うな直線的な形)に限られます。
Hierarchical Level of Detail(HLOD)という上の段があります。 遠くにある複数のアクターを、1つのまとまったメッシュに置き換える仕組みです。World Partitionを使うレベルでは、これが標準の道具立てに含まれます(→ レベルストリーミングとWorld Partition)。
r.VisualizeOccludedPrimitives 1 を実行すると、オクルージョンで除外されたオブジェクトの位置がワイヤーフレームで表示されます。Freeze Renderingより手軽に「いま何が隠れているか」を確認できます。
まとめ
| 技術 | 何をする | 効く数字 | やること |
|---|---|---|---|
| LOD | 遠くを簡略メッシュに差し替える | GPU | Number of LODs を設定、または LOD Group を選ぶ |
| フラスタムカリング | 視野外を描かない | Draw | 自動。バウンズが異常に大きくないか確認する |
| オクルージョンカリング | 物陰を描かない | Draw | 自動。大きな遮蔽物をレベルに置く |
| 距離カリング | 遠いものを描かない | Draw | Cull Distance Volume か Desired Max Draw Distance |
覚えておきたいのは対応関係です 。 LODはGPU、カリングはDraw。 stat unit でどちらが大きいかを見てから、どちらの手当てを打つか決めます。
そして確認の道具が Ctrl + Shift + O(Freeze Rendering)と stat initviews です。カリングは効いていても見た目に出ないので、 効いていることを別途確かめる 必要があります。
ここまでは「レベルに置いてあるものを、いかに描かないか」の話でした。次は視点が1段上がって、 そもそもレベルに読み込まない という方法へ進みます(→ レベルストリーミングとWorld Partition)。
あなたのレベルで一度 Ctrl + Shift + O を押して、カメラを真上へ引いてみてください。思っていたより多くのものが、すでに除外されているかもしれません。