World Streaming baking
Baking turns authored Prefabs and WorldConfig into per-cell Spawnables and a runtime Manifest. Trigger bake from the partition view or from editor automation.
Product chain
Shard Prefabs + WorldConfig
│
▼
PrefabProcessor → cell Spawnables + fragments
│
.wsworld (single aggregation key)
│
▼
Manifest Aggregator Builder
│
├── .wsmanifest
├── optional .wschunk
└── HLOD assets
Before bake, the editor validates with ValidateWorldDescriptor / ValidateManifest.
Trigger bake
| Action | Scope |
|---|---|
Bake World / BakeWorld() | Save all dirty shards + root → validate → Asset Processor rebuild; returns BakeReport (m_ok, m_shardsSaved, m_cellCount, m_warnings) |
Bake Region / BakeRegion(minD, maxD) | Save only dirty shards overlapping the box; aggregator still runs for the whole world (incremental convergence) |
Bake Grid Level / BakeGridLevel(level) | Save only the specified grid (0xFF = all) |
Always Save Dirty Cell Shards (or let Bake World do it) before expecting fresh products. Panel entry: Tools → World Streaming → Bake World Streaming.
Manifest highlights
The .wsmanifest describes cell layout, dependencies, HLOD layers, and contentHash (used by multiplayer handshake). Memory estimates use a lightweight per-entity floor of 4096 bytes unless real asset sizes are enabled.
Manifest chunking
In .wsworld, when m_chunkSize > 0 and cell count exceeds m_chunkCellThreshold, bake emits a root Manifest plus .wschunk files for lazy metadata. Pair with runtime ChunkEvictionCooldownSeconds. Default m_chunkSize = 0 means no chunking.
Server shard index
.wsworld m_shardSize > 0 writes a server ownership index for multi-authority dedicated servers. Default 0 = single authority. This is unrelated to
editor collaboration shards. Runtime ownership:
Multiplayer.
Bake Settings Registry keys
Under /Dawn Engine/WorldStreaming/Bake/:
| Key | Default | Description |
|---|---|---|
HlodWorkerThreads | ≤1 (serial) | Deterministic parallel HLOD workers; products match serial byte-for-byte |
AssignCellGenerations | false | Assign m_generation from content digests |
MergeMultiSourceCells | false | Merge multi-source cells; default off = duplicate CellId fails |
With these off, products and contentHash stay byte-identical to an unconfigured bake. Turning keys on changes the hash.
Baker opt-in switches
| Switch | Default | Effect |
|---|---|---|
m_autoGridLevelFromBounds | off | Choose grid from world AABB |
m_clusterTransformHierarchy | off | Transform subtree follows root cell |
m_resolveRealAssetSizes | off | Memory estimates use real product bytes (hash becomes platform-sensitive) |
m_patchCrossCellHardRefs | off | Record DependentLoad hard-ref repair table |
m_auditTwoTierActivation | off | Two-tier activation audit (report-only) |
Determinism and Golden Manifest
Bake is intended to be deterministic for CI. The Golden Manifest fixture lives at Gems/WorldStreaming/Code/Tests/Assets/GoldenManifest.wsmanifest. Format changes require regenerating it with WS_UPDATE_GOLDEN_MANIFEST=1.
GPU octahedral pre-bake
For HLOD policy GpuOctahedralImpostor (id 4):
- In the partition view, run Bake GPU Octahedral Impostors (or
BakeGpuOctahedralImpostors; optionally checkIsGpuCaptureAvailablefirst). - Then run Bake World Streaming (missing atlas falls back to policy 3).
- Optionally
CaptureOctahedralImpostorScreenshots(outputDir)for inspection.
Details: HLOD.
Next steps
- Runtime streaming: load the Manifest and drive sources.
- Configuration and debugging: bake keys in the full Registry table.
- Scripting:
BakeWorld/BakeRegion/BakeGridLevelfrom Python.