Add `DeferGeneration` property to skip navmesh generation during scene load, allowing tiles to be generated and unloaded on demand at runtime.
New public API:
- `NavMesh.DeferGeneration` - skip tile generation on load
- `NavMesh.RequestTileGeneration`/`RequestTilesGeneration` - fire-and-forget via cache loop
- `NavMesh.UnloadTile`/`UnloadTiles` - remove tiles from the navmesh
Benchmark runner loads scenes in succession.
If a previous scene already generated a navmesh, on the load of another scene the navmesh bounds would not update, because the bounds where already set by the previous scene.
Fixed by always updating the bounds if CustomBounds is not set.
Adds disk persistence for compressed HeightFields to speed up navmesh loading.
Since we serialize the HeightField (not the final PolyMesh), loading still requires PolyMesh generation at runtime. This is intentional, HeightFields are needed for dynamic obstacles and areas.
Small/medium maps: Baking and loading both near-instant, storage ~few MBs
Very large maps (e.g. 4km × 4km): ~10s bake, ~8s load ~500mb
**Baking**
Serializes existing in-memory HeightField cache to disk with layered compression.
**Loading**
Eliminates geometry collection and HeightField generation on scene load.
PolyMesh generation still runs at runtime (allows dynamic areas/links).