遺跡の柱、道沿いの柵、草原の岩。同じ小物を増やすと景色は豊かになりますが、その一つひとつを別のActorとして扱う負荷も増えていきます。
ここで試したいのが インスタンシング です。「同じ形を、これらの位置に置く」とまとめて扱うことで、見た目の数を保ちながら、描画の準備や配置物の管理を軽くできる場合があります。
UEでは Instanced Static Mesh(ISM) コンポーネントを使います。この記事では、配置済みの小物をまとめて比べる方法から始め、後半ではBlueprintで柱を一本、次に八本並べてみます。
この記事でわかること
- 描画命令の回数と、
stat unitのDrawの時間の違い- ISMで共有するものと、配置ごとに変えられるもの
- 配置済みActorの変換と、Add Instanceで増やす手順
- ISM・HISM・Foliageの選び方、削除と距離設定の注意
Windows版UE5で、Actorの配置とBlueprintの基本操作を経験した方を想定します。外部アセットは使わず、Engineの基本形状を練習用にコピーします。掲載図はブログ用の模式図で、Blueprint図は接続を再現するために使います。
ISMは、同じ形と個々の配置をまとめて持つ
ISMの インスタンス は、同じメッシュを使う一個分の配置です。メッシュは立体モデルの形を表すデータで、ISMではその形やマテリアルを共有します。一方、どこへ置き、どちらへ向け、どの大きさにするかは、それぞれ変えられます。
この 位置・回転・スケールを一組にした情報 が、Transform です。ISMは「共通の形」と「個々のTransform」を持つ、と考えると分かりやすくなります。

たとえば同じ柱が32本あっても、32個のActorを作る代わりに、一個のActorへISMコンポーネントを付けて32個の配置を持たせられます。形を共有しながら、一本だけ傾けたり、背を低くしたりできます。
Drawの時間と、描画命令の回数を分ける
ドローコール(Draw Call) は、GPUへ描画を指示する命令です。条件が揃う描画をまとめれば、命令を扱う負担を減らせます。このように仕事をまとめることを バッチング と呼びます。
ただし、柱が32本なら32回、ISMなら必ず1回、とは決まりません。形の中で使うマテリアル、影などを描く別の処理、LOD(細かさの違うモデル)の選択によって分かれます。もとのActor配置でも、エンジンが自動で描画をまとめている場合があります。
| 確認したいこと | 見るもの |
|---|---|
| 描画を準備するCPU側の時間 | stat unit のDraw(ms) |
| 描画命令の数の変化 | stat scenerendering のMesh draw callsなど |
| ゲーム全体が軽くなったか | Frameと、Game・Draw・GPUの時間 |
Drawは回数ではなく時間 です。大きければ描画準備を調べるきっかけになりますが、それだけで原因をドローコールに絞れません。statコマンドの記事と合わせて、同じ場面の変更前後を見ます。
ISMにしても、画面に映る柱の面やピクセルが自動で減るわけではありません。その一方で、多数のActor・Componentを個別に管理する負荷は減らせます。描画命令の数だけで、効果のすべてを 判断しないようにしましょう。
参考:Instanced Static Mesh Component、Merging Actors、Foliage Mode、Add Instance。
実践:配置済みの小物をまとめて比べる
最初はBlueprintで大量生成せず、同じ場所にある小物をISMへ置き換える 方法で確かめます。配置を保てるので、「位置が変わったから軽くなった」と混同しにくくなります。
比較用のレベルを二つ用意する
歩けるThird Personテンプレートのレベルを、練習用に保存して使います。
- Content Browserの「Settings → Show Engine Content」をオンにします。
- 「Engine → BasicShapes」のSphereを選んで
Ctrl + C。自分のContentに作った練習用フォルダでCtrl + Vを押し、SM_InstanceProbe と名付けます。 - コピーを開き、「Nanite Settings → Enable Nanite Support」をオフにします。変更した場合は「Apply Changes」を押して保存します。
- 球を床の上へ一個配置し、
Altを押しながらドラッグして複製します。数個をまとめて選択して複製すると、32個程度まで増やしやすくなります。 - 見通しのよい場所で 、球が重なりすぎないよう数列に並べます。まずは全体を見渡せる小さな範囲で十分です。
これを L_Instances_A として保存し、「File → Save Current Level As」で L_Instances_B も作ります。Aは比較の出発点、Bは変換する側です。数を増やす場合も、二つに分ける前に揃えておきます。
BだけをBatchでまとめる
Bを開き、球のActorだけを選択します。床、Player Start、ライトなどは含めません。
- 上部メニューの「Actor → Merge Actors → Merge Actor Settings」を開きます。
- 方法を Batch にします。同じメッシュをインスタンスへまとめる方法です。
- 「Select the type of Instanced Component」で Instanced Static Mesh Component を選びます。
- 「Instance Replacement Threshold」を 2 にします。同じメッシュが何個以上あれば変換するか、という条件です。
- 「Replace Source Actors」をオンにして「Merge Actors」を実行します。B内の元の球を、生成されたActorへ置き換えます。

生成されたActorを選び、DetailsでISMコンポーネントとインスタンス数を確認します。球が32個なら32個分の配置が残り、見た目の位置も同じであることを確かめてから保存します。変換対象の設定によっては、コンポーネントが複数に分かれる場合もあります。
元の球と変換後の球が両方残っていると、二重に描く比較になります。Bで元のActorが置き換わったかをOutlinerでも確認してください。やり直すときはAからBを作り直せます。
同じ視点で計測する
AとBをそれぞれStandaloneで起動し、同じ場所・向きから見ます。Player Start、画質、解像度、FPS上限は共通にし、読み込み直後を避けて値を控えます。
起動したゲームのコンソールで stat unit と stat scenerendering を入力すると、時間と描画命令数を表示できます。表示の開き方は、先ほどのstatコマンドの記事で確認できます。

| 記録するもの | A:個別Actor | B:ISM |
|---|---|---|
| 見える球の数と配置 | 変更前を確認 | 同じか確認 |
| Frame / Game / Draw / GPU | それぞれmsを記録 | 同じ条件で記録 |
| Mesh draw calls | 表示された数を記録 | 変化を見る |
32個程度では、時間の差が小さくても不思議ではありません。仕組みを確認できたら、128個、256個と増やした比較を試せます。何ミリ秒下がるかは、使うモデルと実行環境次第 です。
- 描画命令が減ってFrameも短くなったら、今の場面では有効な変更です。
- 命令が減ってもFrameが変わらなければ、GPUの別の仕事やFPS上限なども見ます。
- 命令自体があまり変わらなければ、元からの自動インスタン シングや、対象以外の描画を調べます。
差が不明瞭なら、一度Aへ戻って同じ傾向が出るか確かめます。小さな値の上下だけで結論を急がず、実際に遊ぶ場面でも確認しましょう。
ISM・HISM・Foliageを使い分ける
同じ形を並べる方法は、ISMだけではありません。まず「どう配置するか」「どれくらい動くか」で候補を選びます。

| 方法 | 考え方 | 試したい場面 |
|---|---|---|
| ISM | 一つのコンポーネントに複数の配置を持つ | まず試す基本。配置を動かす場合やNaniteとの併用 |
| HISM | 配置を空間的なグループの階層にまとめる | 数千規模で、ほぼ動かない草木や岩 |
| Static Mesh Foliage | ブラシで塗り、内部でインスタンス化する | 地形へ自然物を手早く配置したい |
HISM の階層は、広い範囲を小さなグループに分けて「どの一帯が見えるか」を絞るためのものです。動かない大量の配置では役立ちますが、配置を頻繁に変える と階層の更新も負担になります。
現行のISMも、インスタンスごとのLODとカリングに対応しています。「ISMは遠い物も全部描く」「大量なら無条件でHISM」と覚える必要はありません。まずISMを試し、HISMが合いそうな場面で置き換えて比べます。
Foliageには Actor Foliage もあります。こちらはActorを配置する種類で、Static Mesh Foliageと同じ描画のまとめ方を期待するものではありません。ランドスケープの記事から使う場合も、どちらを置いているか確認します。
Blueprintで柱を一本、八本と増やす
手作業の配置をまとめる方法が分かったら、次はBlueprintから増やしてみます。道沿いの柱や、部屋の大きさに合わせて並べる小物に応用できます。
まず一本だけ出す
Actorを親に BP_InstanceRow を作ります。「Components → Add」からInstanced Static Meshを追加し、名前を Posts にします。DefaultSceneRootは残し、Postsの位置・回転は0、スケールは各軸1にします。
Postsの「Static Mesh」にはEngineのBasicShapesにある Cube を指定します。練習用にコピーする場合は、最初のSphereと同じ手順です。「Mobility」は動かせる設定の Movable、今回は描画だけを見るため「Collision Presets」は当たり判定を使わない NoCollision にします。「Instances」へ手動で要素は追加せず、空のままにします。
