We've spent eight weeks on systems. Now the world. Settings menus don't help when your map takes 90 seconds to load and eats 20 GB of RAM, which is where every open-world beginner project ends up — mine included.

The cause is simple: by default, Unreal loads the whole level. Every actor, every mesh, every reference. The fix has three names and the forums will happily argue about all of them. Here's the short version.

The three systems

Level Streaming Volumes — you place a box; when the player enters, a sublevel loads. Oldest approach, still works, zero code.

Sublevels + Blueprint — you call Load Stream Level / Unload Stream Level yourself. Full control, full responsibility.

World Partition — UE5 only. You don't split anything. The engine grids your world automatically and streams cells around the player.

There's also World Composition, which you'll see in older tutorials. Epic considers it legacy and recommends World Partition for UE 5.0 and later. If a tutorial opens with World Composition, close it.

How to choose

Discrete places — a hub, a dungeon, a menu level? Sublevels. They're conceptual units. Streaming them by hand is honest and readable.

One continuous landscape you walk across? World Partition. Manually managing 200 streaming volumes across a large map isn't level design, it's bookkeeping.

Something small? Neither. Streaming a 500×500 m level buys you nothing and costs you a debugging surface. Load it and move on.

I build a 5×6 km world. That's World Partition territory and there was never a real decision to make.

What World Partition actually gives you

Three things, and they're separable:

Grid streaming. Your world is cut into cells (default 12,800 uu / 128 m). Cells within the loading range around the player are loaded. Nothing you do, no volumes, no code.

One File Per Actor (OFPA). Each actor becomes its own file on disk instead of living inside the .umap. If you work in a team, this is the feature — two people can edit the same map without a merge conflict. Solo, it means your version control history is thousands of tiny files instead of one giant binary. Both are fine, just know which trade you took.

Data Layers. Gameplay-driven streaming on top of the grid. "Village before the fire" and "village after the fire" as two layers, one toggle. This is the part most beginners don't discover for a year and then wish they had.

HLODs are not optional

The mistake is thinking World Partition solves distance for you. It doesn't. Cells outside your loading range are gone — including the mountain you can see from here.

HLODs are the answer: merged, simplified stand-ins for unloaded cells. Build them (Build → Build HLODs) or your horizon is a void. They take a while to generate and they'll be stale until you rebuild, which is why so many World Partition projects look like they're falling apart at 500 metres.

The persistent level is not storage

Whichever system you choose: the persistent level holds the essentials — a Level Blueprint, lighting setup, maybe your player start. Not your content. Every actor you leave in the persistent level is an actor that never unloads.

Same discipline applies to references. A streamed-out level whose actors are still referenced by something in the persistent level cannot be freed. Streaming does not defeat hard references — it just makes them harder to find. Which brings us back to soft references, and why that was post number one.

Common pitfalls

  • Assuming World Partition is on. It's on for the Open World template. Convert an existing map explicitly (Tools → Convert Level), and back it up first.
  • Skipping HLODs. Everything past your loading range disappears. This is the single most common "World Partition is broken" report.
  • Content in the persistent level. It never unloads. That's the whole point of the persistent level, and the whole problem with using it as a dumping ground.
  • A hard reference from the persistent level into a streamed level. It stays in memory. You gained nothing.
  • Blueprints that reach across levels. An actor in a streamed level may not exist. Interfaces and dispatchers, not Get All Actors Of Class and a cast.
  • World Partition on a dedicated server. Server streaming isn't driven by rendering. If you're multiplayer, read the server-specific docs before committing — the forums are full of people who found this out late.
  • Testing streaming in the editor only. PIE loading is not packaged loading. Profile the build.

30-second recap

  • Default behaviour is: load everything. That's the problem you're solving.
  • Discrete places → sublevels. Continuous landscape → World Partition. Small map → neither.
  • World Composition is legacy. Ignore tutorials that use it.
  • World Partition = grid streaming + OFPA + Data Layers. Three separate wins.
  • Build HLODs or your horizon is empty.
  • Persistent level holds setup, not content.
  • Hard references defeat streaming. Every time.

Next Sunday: foliage painting — the settings you should change before you place your first tree, and the ones the tutorials never mention.

— Marco