The FW3.4 dense-Arwic pair triggered the +/-20% stop rule (+33.5% CPU
p50, 14x frame allocation). This slice removes the three measured
costs without changing GPU command order (the referee suites assert
identical recorded call sequences):
- WalkFrameDriver: Collect (ONE walk per frame - no GPU work; leaf
calls and flush points become a recorded event list; the driver
absorbed the renderer collection pass and exposes the visited sets)
+ Replay (prepare the whole stream once, then replay events,
interleaving DrawOrderedRange with leaf calls in the exact recorded
order). RunFrame = Collect+Replay for existing callers.
- WbDrawDispatcher: SubmitOrderedStream split into PrepareOrderedStream
(all sections + commands + merge runs uploaded once per frame) and
DrawOrderedRange (bind-once latch; per-run pipeline + DrawIdOffset +
DrawIndirectRangeRhi). Load-bearing correctness catch from the
implementation round: merge runs take FORCED BREAKS at the recorded
event marks - whole-stream merging must not fuse two segments that
retail separates with a leaf GPU call (shell, punch); the straddle
assert stays as a dead-code safety net.
- WalkProductionWorldData: WalkFrameStaticRecords carries an
ArraySegment into a per-frame grow-only arena; the per-cell
fresh-array copies (the 1.9 MB/frame alloc p50) are gone - zero
steady-state allocation after warmup.
Suites (lead-verified): full Release build 0 warnings; hermetic
6,758/0; Walk lane 209/1; InstalledDat Walk conformance 40/1
untouched. Next: the dense-Arwic re-measure against the same-session
baseline.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The piece that turns walk-visited static content into draws, with no
production frame wiring (FW3.2b roots the frame):
- TryClassifyBatch: ONE shared per-batch classify core (the #426
untextured gate, #188 opacity promotion, texture resolve, foliage
classification, in the exact original order) extracted from
ClassifyBatches; the classic and packed classifiers now call it -
behavior-identical, proven by the full hermetic + InstalledDat +
Core Wb suites.
- ClassifyEntityForWalk / WalkClassifiedBatch: the per-entity seam
yielding per-batch keys + instance data WITHOUT InstanceGroup
bucketing, plus the per-part selection data (picking stays alive on
the walk path - the survey's unlisted-consumer fix).
- WalkStaticStreamPopulator: per-entity walk-ordered opaque appends
(under depth Less, opaque order is pixel-relevant only for coplanar
surfaces, which retail resolves first-drawn-wins in ITS order -
never material-grouped), translucent instances to the SAME
RetailAlphaQueue via SubmitWalkAlphaInstance (identical viewer
distances; walk-order submission improves retail's tie fidelity),
selection parts published per entity.
- SubmitOrderedStream now owns _orderedDrawCullModes, retiring the
FW2-recorded alpha-scope interleaving constraint;
DrawIndirectRangeRhi takes an optional cull array (all existing
call sites unchanged). The referee test was verified to FAIL
against the old shared-scratch behavior.
- WalkDrawStage.OutdoorStatic added for the landscape turn.
Suites: full Release build 0 warnings; Walk lane 195/1 skip;
hermetic 6,747/0 (the two failures the implementation round reported
were transient - both pass in isolation and in the full run).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>