Placing 500 identical barrels, rocks, or fence posts in an Unreal Engine 5 scene shouldn't cost you 500 draw calls — but it will if you use a plain Static Mesh Actor for each one. Instanced Static Meshes (ISM) collapse hundreds of identical mesh instances into a single draw call, and picking the right variant is what separates a smooth 60 fps environment from a stuttering mess.
How Instanced Static Meshes reduce draw calls in Unreal Engine 5
Each draw call has a fixed CPU overhead: state setup, validation, driver handshake. On PC that overhead is a few microseconds; on mobile or console it climbs fast. When your open-world level has 2,000 grass clumps or 300 street lamps, the CPU never gets a breath between calls.
ISM solves this at the render thread level. You register a single Static Mesh resource, define a list of per-instance transforms (position, rotation, scale), and UE5 renders the whole batch in one draw call. GPU memory goes up slightly — one transform matrix per instance — but that tradeoff is almost always worth it.
![]()
When ISM doesn't help: instancing only batches draw calls for *identical* meshes sharing the same material. If you mix 10 lamp variants with 5 different materials, you still have 50 unique draw calls. The solution is texture atlasing or material parameter collections — batch the geometry first, then address material variety.
ISM vs HISM vs ISMC: choose the right component
UE5 ships three instancing components. Each builds on the last.
| Component | Full Name | Key Feature | Best For |
|---|---|---|---|
| `ISMComponent` | Instanced Static Mesh | Single draw call batch | Runtime-placed repeated props (crates, pillars, pickups) |
| `HISMComponent` | Hierarchical Instanced Static Mesh | Per-instance cull + LOD switching | Foliage, large outdoor environments, 1000+ instances |
| Foliage Tool (ISMC) | ISM with painter UI | Density brush + density controls | Artist-painted scatter layers |
Use HISM for anything that needs per-instance visibility culling or automatic LOD transitions. For 10–50 props placed at runtime — ammo crates, dungeon pillars, pickups — plain ISM is simpler and has slightly lower overhead. The Foliage Tool wraps HISM with paint-based density controls; use it when artists need to hand-paint distribution across terrain.
Blueprint and C++ setup for Instanced Static Meshes in UE5
Blueprint approach
- Add an Instanced Static Mesh Component to your Actor blueprint.
- Set the Static Mesh asset reference in the Details panel.
- On `BeginPlay`, loop and call `Add Instance` with a per-placement `FTransform`.
For runtime-generated scatter (e.g. procedural dungeon rooms), store your target locations in an array and iterate:
```
for each Location in SpawnLocations:
ISMComponent → AddInstance(MakeTransform(Location, Rotation, Scale))
```
C++ approach
```cpp
// Actor header
UPROPERTY(VisibleAnywhere)
TObjectPtr<UInstancedStaticMeshComponent> ISMComp;
// BeginPlay — use AddInstances (plural) for batch insertion
TArray<FTransform> Transforms;
for (int32 i = 0; i < Count; i++)
{
Transforms.Add(FTransform(FRotator::ZeroRotator, SpawnLocations[i], FVector::OneVector));
}
ISMComp->AddInstances(Transforms, /*bShouldReturnIndices=*/false);
```
Prefer `AddInstances` (plural) over calling `AddInstance` in a loop — the batch version rebuilds render data once, not once per element. On 1,000 instances the difference is significant. You can source free, optimized GLB props from the BitSoul marketplace, import them via UE5's GLB importer, and feed the Static Mesh reference directly into your ISM component.
![]()
Profiling and per-instance performance budgets
Open `stat RHI` and `stat SceneRendering` to measure ISM impact. Key lines to watch:
- DrawPrimitive calls — should drop sharply after converting Static Mesh Actors to ISM
- MeshDrawCommands (Cached) — ISM populates cached commands; if the uncached count rises, check material complexity
- Triangles — ISM doesn't reduce triangle count; pair it with LODs (HISM handles per-instance LOD switching automatically)
ISM performance checklist:
- [ ] All instances share one material slot — or use Material Parameter Collections for per-instance variation without breaking batching
- [ ] Cull distance set: call `Set Cull Distance` on the component to stop rendering beyond camera range
- [ ] LODs configured on the Static Mesh asset (HISM switches them per-instance; plain ISM uses a single global LOD)
- [ ] `Keep Simulation Data` is off unless you need runtime physics per instance (it doubles memory)
- [ ] Nanite enabled on meshes with >100k triangles targeting PC or console — pairs cleanly with HISM culling
For outdoor environments, HISM + Nanite is the strongest combination: Nanite virtualizes the triangle budget, HISM handles per-instance culling, and draw call count stays flat regardless of how many objects are on screen. Browse BitSoul's marketplace for GLB environment props — crates, barrels, structural pieces — already optimized for UE5's instancing pipeline.
---
*This post is part of the Ultimate Guide to Free 3D Game Assets — BitSoul's complete reference for formats, texturing, rigging, optimization, and engine integration.*