feat(render #53): wire EntityClassificationCache.InvalidateLandblock at LB demote/unload
GpuWorldState.RemoveEntitiesFromLandblock now invokes an optional Action<uint> callback before zeroing the entity list. GameWindow wires this to EntityClassificationCache.InvalidateLandblock so cache entries get swept on LB demote (Near to Far) and unload. Per spec section 5.3 W3b. The callback receives the canonicalized landblock id (low 16 bits forced to 0xFFFF), matching the LandblockHint stored at Populate time. Trace: GpuWorldState._loaded keys are canonical (set by AppendLiveEntity), LandblockEntries yields kvp.Key as LandblockId, WalkEntitiesInto propagates entry.LandblockId into _walkScratch, the dispatcher's populateLandblockId reads that tuple and stores it as LandblockHint. Phase 3 (invalidation hooks) complete. The cache now stays correct across all spec-identified mutation events: despawn, ObjDescEvent (despawn+ respawn), LB demote, LB unload. Two integration tests added: - RemoveEntitiesFromLandblock_FiresUnloadCallbackWithCanonicalId asserts the callback fires once with the canonical id even when called with a cell-resolved input (low 16 bits non-FFFF). - RemoveEntitiesFromLandblock_NotLoaded_DoesNotFireCallback asserts the early-return path doesn't fire the callback for unknown landblocks. Tests: 1706 passed / 8 failed (baseline). Sentinel: 110/110. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
1d1afcd562
commit
489174f21c
3 changed files with 80 additions and 2 deletions
|
|
@ -1612,7 +1612,14 @@ public sealed class GameWindow : IDisposable
|
|||
var wbEntitySpawnAdapter = new AcDream.App.Rendering.Wb.EntitySpawnAdapter(
|
||||
_textureCache!, SequencerFactory, _wbMeshAdapter!);
|
||||
_wbEntitySpawnAdapter = wbEntitySpawnAdapter;
|
||||
_worldState = new AcDream.App.Streaming.GpuWorldState(wbSpawnAdapter, wbEntitySpawnAdapter);
|
||||
// Phase Post-A.5 #53 (Task 12): wire EntityClassificationCache.InvalidateLandblock
|
||||
// so Tier 1 cache entries get swept on LB demote (Near to Far) and unload.
|
||||
// Per spec §5.3 W3b. The callback receives the canonical landblock id
|
||||
// matching the LandblockHint stored at Populate time.
|
||||
_worldState = new AcDream.App.Streaming.GpuWorldState(
|
||||
wbSpawnAdapter,
|
||||
wbEntitySpawnAdapter,
|
||||
onLandblockUnloaded: _classificationCache.InvalidateLandblock);
|
||||
|
||||
_wbDrawDispatcher = new AcDream.App.Rendering.Wb.WbDrawDispatcher(
|
||||
_gl, _meshShader!, _textureCache!, _wbMeshAdapter!, _wbEntitySpawnAdapter, _bindlessSupport!,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue