Skip to content

feat: cut MeshCollider cook cost in import (combine / off-thread / defer) #263

Description

@nigel-hall-codes

Parent: #259 (techdesign) — see sdlc/#259/design.md, lever L3. Gated on #446 (profile first — #260 closed without recording numbers).
Reanalyzed 2026-07-04: gate moved #260#446; building-collider facts updated; options unchanged.

Why

Each chunk adds a GameObject + MeshFilter + MeshCollider per road, sidewalk, and intersection (see the road/sidewalk/intersection loops in ImportChunk). PhysX cooks each collider inline on AddComponent, no batching — tens of thousands of cooks city-wide. Hypothesised top-tier cold-import cost (confirm via #446).

Update: buildings now also carry one combined MeshCollider per chunk (#415, for graffiti spray raycasts #390) — so the "combine per chunk" pattern already has two precedents (building render mesh + building collider).

Options (pick after #446 numbers, increasing effort)

  1. Combine colliders per chunk — merge road/sidewalk/intersection collider meshes into one (or one-per-type). Cuts collider and GameObject count (smaller prefabs). Constraints: keep roads/intersections on the Road layer (traffic raycasts) separate from sidewalks (kerbs must not read as drivable) and from the building collider (spray targets); RoadNetwork builds from _names.json, not colliders, so per-osmId collider identity is not load-bearing — verify nothing else reads collider names.
  2. Off-thread cookPhysics.BakeMesh(meshId, convex) in parallel jobs, assign sharedMesh on the main thread.
  3. Defer colliders to runtime chunk-load in ChunkStreamer (only resident chunks pay). Highest risk — verify traffic + on-foot + spray tolerate collider-free prefabs at import time.

Done when

Collider-related import cost is materially reduced (per #446 before/after) with traffic raycasts, on-foot physics, and spray-paint hits still correct.

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions