perf(render) Campaign FW3.4a: one walk pass; prepare-once/draw-ranges; arena records
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>
This commit is contained in:
parent
6301e4dbea
commit
212f5a12e5
7 changed files with 1051 additions and 359 deletions
|
|
@ -27,8 +27,9 @@ namespace AcDream.App.Tests.Rendering.Walk;
|
|||
/// equivalence referee. Covers <see cref="WbDrawDispatcher.ClassifyEntityForWalk"/>
|
||||
/// (the shared per-entity classify seam), <see cref="WalkStaticStreamPopulator"/>
|
||||
/// (opaque → <see cref="OrderedDrawStream"/>, translucent → the alpha queue,
|
||||
/// selection publish), and the FW3.2a own-cull-scratch fix to
|
||||
/// <c>SubmitOrderedStream</c>.
|
||||
/// selection publish), and the FW3.2a own-cull-scratch fix to the ordered
|
||||
/// submitter (<c>PrepareOrderedStream</c>/<c>DrawOrderedRange</c> as of
|
||||
/// Campaign FW stage FW3.4a).
|
||||
/// </summary>
|
||||
public sealed class WalkStaticStreamPopulatorTests
|
||||
{
|
||||
|
|
@ -364,18 +365,18 @@ public sealed class WalkStaticStreamPopulatorTests
|
|||
fx.AlphaQueue.AbortFrame();
|
||||
}
|
||||
|
||||
// ── Deliverable 3: SubmitOrderedStream's own cull scratch ──────────────
|
||||
// ── Deliverable 3: the ordered submitter's own cull scratch ────────────
|
||||
|
||||
[Fact]
|
||||
public void SubmitOrderedStream_DoesNotReadOrCorruptTheSharedAlphaCullScratch()
|
||||
public void PrepareThenDrawOrderedStream_DoesNotReadOrCorruptTheSharedAlphaCullScratch()
|
||||
{
|
||||
using var fx = new DispatcherFixture();
|
||||
using DrawScope draw = fx.BeginDraw();
|
||||
|
||||
// Poison the SHARED _drawCullModes scratch the alpha path owns — the
|
||||
// exact array SubmitOrderedStream used to write into before FW3.2a.
|
||||
// exact array the ordered submitter used to write into before FW3.2a.
|
||||
// Under the OLD shared-scratch behavior this test's second assertion
|
||||
// fails: SubmitOrderedStream's own command overwrites index 0 with
|
||||
// fails: the ordered path's own command overwrites index 0 with
|
||||
// its own cull mode (Clockwise), destroying the alpha path's poison.
|
||||
FieldInfo field = typeof(WbDrawDispatcher).GetField(
|
||||
"_drawCullModes", BindingFlags.NonPublic | BindingFlags.Instance)!;
|
||||
|
|
@ -388,7 +389,8 @@ public sealed class WalkStaticStreamPopulatorTests
|
|||
Matrix4x4.Identity, WalkDrawStage.Terrain, 0, 0,
|
||||
WbDrawDispatcher.InstanceLightSet.Disabled, 0, 1f, Vector2.Zero, 0));
|
||||
|
||||
fx.Dispatcher.SubmitOrderedStream(draw.Frame, draw.Pass, stream, Matrix4x4.Identity);
|
||||
fx.Dispatcher.PrepareOrderedStream(draw.Frame, stream, Matrix4x4.Identity);
|
||||
fx.Dispatcher.DrawOrderedRange(draw.Pass, 0, stream.Count);
|
||||
|
||||
// (1) The ordered submission's OWN recorded cull call reflects the
|
||||
// STREAM's cull mode (Clockwise -> GpuCullMode.Front), not the
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue