Cluster LOD: pack small faces' root pages together (page pool ~22% full) #769

Open
opened 2026-10-15 00:24:21 +00:00 by sky_line · 0 comments
Owner

Cluster LOD's page pool is still mostly empty slots. In-world (Cloudsdale, 68 rigged characters, builder v3 with root-page packing): fill 22% (roots 17%, 51/236 MB payload/slots), pages res 3023/4096 (roots 2739) for 2716 faces.

Cause

Builder v3 lets a face's coarsest groups fill its own last root page, but every face still pins at least one 80 KB root page. Small faces dominate: of ~25.8k cached faces, 31% have <= 64 LOD0 triangles (median 2 DAG levels), so most root pages hold 1-5 KB of payload in an 80 KB slot.

Proposal

Pack the roots (and other small groups) of many faces into shared pages, or give pinned root data its own small-block sub-allocator:

  • Shared root pages across faces/meshes (pinned while any member mesh is registered; free on liveness when all members are gone), or a separate root arena with variable-size blocks addressed by (block, offset).
  • Keep G1-G7 guarantees and residency closure (a non-root page may only depend on resident roots); page-table / addressing changes for consumers if root data moves out of the per-mesh page range.
  • Builder version bump (cache rebuild).
  • Report live/cap/peak and payload fill per arena on the CLOD line.

Expected: roughly 150-180 MB back at that scene; small meshes stop costing 80 KB+ each. Related: cluster LOD memory is currently a net cost vs legacy (LOD on COSTS 580 MB vs the LOD-off estimate 343 MB there).

Cluster LOD's page pool is still mostly empty slots. In-world (Cloudsdale, 68 rigged characters, builder v3 with root-page packing): `fill 22% (roots 17%, 51/236 MB payload/slots)`, `pages res 3023/4096 (roots 2739)` for 2716 faces. ## Cause Builder v3 lets a face's coarsest groups fill its own last root page, but every face still pins at least one 80 KB root page. Small faces dominate: of ~25.8k cached faces, 31% have <= 64 LOD0 triangles (median 2 DAG levels), so most root pages hold 1-5 KB of payload in an 80 KB slot. ## Proposal Pack the roots (and other small groups) of many faces into shared pages, or give pinned root data its own small-block sub-allocator: - Shared root pages across faces/meshes (pinned while any member mesh is registered; free on liveness when all members are gone), or a separate root arena with variable-size blocks addressed by (block, offset). - Keep G1-G7 guarantees and residency closure (a non-root page may only depend on resident roots); page-table / addressing changes for consumers if root data moves out of the per-mesh page range. - Builder version bump (cache rebuild). - Report live/cap/peak and payload fill per arena on the CLOD line. Expected: roughly 150-180 MB back at that scene; small meshes stop costing 80 KB+ each. Related: cluster LOD memory is currently a net cost vs legacy (`LOD on COSTS 580 MB vs the LOD-off estimate 343 MB` there).
sky_line added this to the Slipstream project 2026-10-15 00:24:21 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
sky_line/Slipstream#769
No description provided.