perf(streaming): reserve destination reveal capacity
Join destination scheduling to the canonical reveal generation, protect its share across every typed frame-budget dimension, and prevent stale work from clearing a replacement reservation. Remove forced incomplete materialization and project retail's centered portal wait cue while the authored tunnel remains active. Tests: Release build clean; 91 focused reservation/reveal tests; full solution 8,158 passed, 5 skipped. Co-authored-by: Codex <noreply@openai.com>
This commit is contained in:
parent
98f1ac8934
commit
2ff8f844b0
33 changed files with 870 additions and 230 deletions
|
|
@ -44,12 +44,14 @@ What does NOT go here:
|
|||
smooth and physics, collision, and wire state remain correct.
|
||||
- **Build hygiene:** `#228` records 17 clean-Release test-project warnings;
|
||||
production compilation and all tests pass.
|
||||
- **Performance side track:** Slices A–D and Slice E0–E4 are complete. Typed
|
||||
- **Performance side track:** Slices A–D and Slice E0–E5 are complete. Typed
|
||||
completion admission, immediate generation-scoped old-world quiescence, and
|
||||
budgeted full-window/recenter retirement are live. Publication now advances
|
||||
from retained render/physics/static/building/EnvCell cursors without replay;
|
||||
E5 destination reservation/reveal joining is next. The physical console is
|
||||
available and remains reserved for the E6 connected gate. Evidence:
|
||||
from retained render/physics/static/building/EnvCell cursors without replay.
|
||||
The canonical reveal generation now owns the destination reservation across
|
||||
every typed budget dimension; incomplete worlds remain in portal space with
|
||||
retail's centered wait cue. The physical console is available for E6
|
||||
deterministic and connected closeout. Evidence:
|
||||
[`research/2026-07-24-slice-d-unified-residency-report.md`](research/2026-07-24-slice-d-unified-residency-report.md).
|
||||
|
||||
The [documentation map](README.md) defines how this tactical ledger relates to
|
||||
|
|
@ -3507,7 +3509,12 @@ Tests: `DungeonStreamingGateTests` (4), `TeleportArrivalRulesTests` (4). Registe
|
|||
|
||||
**Files:** `GameWindow.cs` `OnLivePositionUpdated` (drop stale center) + `TeleportArrivalReadiness`; `src/AcDream.App/World/TeleportArrivalController.cs` (`TeleportArrivalRules`); `src/AcDream.App/Streaming/DungeonStreamingGate.cs`; `src/AcDream.Core/Physics/PhysicsEngine.cs` (`RemoveLandblock` CurrCell clear + NO-LANDBLOCK verbatim).
|
||||
|
||||
**Acceptance:** run into a portal, run out, re-enter — repeatedly in one session, each time placing + streaming correctly. Verify the dungeon→outdoor exit completes promptly (log `teleport complete`, not `teleport HOLD gave up … force-snapping`) with `streaming: dungeon EXIT-expand`, the outdoor world fully streamed, collision working. Also re-checks **#138**.
|
||||
**Acceptance:** run into a portal, run out, re-enter — repeatedly in one
|
||||
session, each time placing + streaming correctly. Verify the dungeon→outdoor
|
||||
exit remains in portal space until canonical destination readiness (with the
|
||||
centered retail wait cue if it exceeds five seconds), then completes with
|
||||
`streaming: dungeon EXIT-expand`, the outdoor world fully streamed, and
|
||||
collision working. Also re-checks **#138**.
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
|
|
@ -14,15 +14,17 @@ banner cannot silently override the current program state.
|
|||
[`plans/2026-07-23-world-interaction-completion.md`](plans/2026-07-23-world-interaction-completion.md).
|
||||
The eight-slice `GameWindow` decomposition and its connected visual matrix
|
||||
are complete.
|
||||
- **Current active engineering program:** Slices A–D and Slice E0–E4 of
|
||||
- **Current active engineering program:** Slices A–D and Slice E0–E5 of
|
||||
[`plans/2026-07-24-modern-runtime-architecture.md`](plans/2026-07-24-modern-runtime-architecture.md)
|
||||
are complete. Production world-mesh streaming consumes the validated
|
||||
prepared package, typed residency is bounded/accounted, and streaming now
|
||||
has typed admission plus immediate old-generation quiescence, metered
|
||||
retirement, and retained cursor-budgeted publication across render, physics,
|
||||
statics, building registries, collision/reflood, and EnvCells. E5 destination
|
||||
reservation/reveal joining is next. The physical console is available; its
|
||||
connected performance and visual evidence remains the E6 gate. See
|
||||
statics, building registries, collision/reflood, and EnvCells. The canonical
|
||||
reveal generation now owns an exact destination reservation across every
|
||||
typed budget dimension; incomplete destinations remain in portal space and
|
||||
receive retail's centered wait cue instead of forced early reveal. The
|
||||
physical console is available for E6 deterministic/connected closeout. See
|
||||
the [Slice D residency report](research/2026-07-24-slice-d-unified-residency-report.md).
|
||||
- **Completed gates:** R6 locomotion/collision/projectile/teleport/radar and
|
||||
the final two-client portal-out/materialization observer comparison (`#218`).
|
||||
|
|
@ -34,7 +36,7 @@ banner cannot silently override the current program state.
|
|||
user decision gate; Linux/headless automation (Track LH) remains future work.
|
||||
- **Divergence audit:** 178 active rows — IA 17, AD 37, AP 85, TS 34,
|
||||
and UN 5 — plus the retained retired TS-37 history note.
|
||||
- **Latest automated baseline:** Release build succeeds; 8,152 tests pass and
|
||||
- **Latest automated baseline:** Release build succeeds; 8,158 tests pass and
|
||||
five are intentionally skipped. The capped, uncapped, and dense-Arwic
|
||||
physical prepared-asset routes all completed their portal/input/lifetime
|
||||
assertions and disconnected gracefully.
|
||||
|
|
|
|||
|
|
@ -717,10 +717,16 @@ single-consumer peek/read source so the update thread prices a result before
|
|||
adopting it. `StreamingController` is the sole scheduler: it admits through the
|
||||
typed meter into reusable destination/control/unload/Near/Far FIFOs, preserves
|
||||
exact reference identity and retry position, rejects stale generations, and
|
||||
executes every class through the same meter. Priority changes order, never the
|
||||
executes every class through the same meter. The canonical reveal generation
|
||||
supplies one exact destination cell/radius reservation; the meter protects its
|
||||
configured share across time, completion admissions, retained CPU bytes,
|
||||
entity operations, requested GPU bytes, and GL-retirement admissions. A
|
||||
completion retains the reveal generation that classified it, so a stale
|
||||
completion or teardown cannot consume or clear a replacement generation's
|
||||
reservation. Priority changes order and reserved share, never the global
|
||||
budget. Lifecycle artifacts publish worker and per-class backlog, retained
|
||||
bytes/age, yields, oversizes, overruns, and pending publication/retirement
|
||||
facts.
|
||||
bytes/age, per-lane work, yields, oversizes, overruns, and pending
|
||||
publication/retirement facts.
|
||||
|
||||
At a hard login/portal reveal edge, `WorldGenerationQuiescence` makes the old
|
||||
generation unavailable through the same `WorldRevealCoordinator` lifetime.
|
||||
|
|
@ -748,12 +754,16 @@ pending publication.
|
|||
|
||||
`WorldRevealCoordinator` is the single App-layer owner of each login or portal
|
||||
reveal lifetime. It composes the canonical `WorldRevealReadinessBarrier` with
|
||||
generation-scoped lifecycle observation, so begin, preparation, readiness,
|
||||
materialization, world visibility, completion, and cancellation cannot be
|
||||
wired independently. The barrier joins `StreamingController`/`GpuWorldState`
|
||||
generation-scoped lifecycle observation and the streaming destination
|
||||
reservation, so begin, preparation, readiness, materialization, world
|
||||
visibility, completion, cancellation, and reserved capacity cannot be wired
|
||||
independently. The barrier joins `StreamingController`/`GpuWorldState`
|
||||
static-mesh publication, `WbDrawDispatcher` composite-texture warmup, and
|
||||
`PhysicsEngine` destination residency. Login's sky-only gate and portal-space
|
||||
transit consume the same predicate; they differ only in presentation.
|
||||
transit consume the same predicate; they differ only in presentation. There is
|
||||
no timeout that reveals incomplete content: a delayed portal keeps its DAT
|
||||
tunnel live and, after five seconds, projects retail's centered
|
||||
`"In Portal Space - Please Wait..."` retained notice until readiness converges.
|
||||
Composite preparation advances after `WbMeshAdapter.Tick` on the render
|
||||
thread, never from the streaming worker. This is acdream's asynchronous equivalent of retail
|
||||
`SmartBox::UseTime` holding position completion while
|
||||
|
|
|
|||
|
|
@ -272,7 +272,9 @@ src/AcDream.App/
|
|||
│ └── SelectionInteractionController.cs # owns selection intents, Use/PickUp, auto-walk deferral
|
||||
├── Streaming/
|
||||
│ ├── LandblockPresentationPipeline.cs # DAT build/apply/retire transaction and resource publication
|
||||
│ └── ... # shipped streamer/world-state/reveal owners
|
||||
│ ├── StreamingController.cs # typed frame scheduler + reveal destination reservation
|
||||
│ ├── WorldRevealCoordinator.cs # canonical readiness, quiesce, and reservation lifetime
|
||||
│ └── ... # shipped streamer/world-state owners
|
||||
├── Input/ # (already exists)
|
||||
├── Audio/ # (already exists)
|
||||
└── Plugins/ # (already exists)
|
||||
|
|
@ -451,7 +453,7 @@ useful ordering seam, but its ownership status is **partial**.
|
|||
| World environment | **Complete ownership** | `WorldEnvironmentController` solely owns WorldTime, the loaded DAT sky, current day group, Weather, server synchronization, AdminEnvirons bridging, and debug time/weather cycles. `GameWindow` keeps ABI-compatible readonly aliases to the same clock/weather instances and composes one render source plus the two live-session callbacks. TS-54/TS-55 register the remaining centered UI sound and full fog/ambient/radar behavior gaps. |
|
||||
| Live identity/lifetime | **Complete App integration** | `LiveEntityRuntime` owns incarnation identity, accepted snapshots/timestamps, runtime components, and logical/spatial lifetime. `LiveEntityHydrationController`, `LiveEntityRuntimeTeardownController`, and `LiveEntityNetworkUpdateController` own DAT-backed hydration, retryable cleanup, and accepted Position/Vector/State/Movement presentation without a second GUID owner (`aa90c646`). |
|
||||
| Inbound/object-frame order | **Complete App orchestration** | `UpdateFrameOrchestrator` owns the complete typed host phase graph; `RetailInboundEventDispatcher`, `RetailLiveFrameCoordinator`, `LiveObjectFrameController`, `LiveSpatialPresentationReconciler`, streaming/input/teleport/player-mode/camera owners preserve the accepted order. `GameWindow.OnUpdate` is one profiler-scoped handoff (`e91f3102`). |
|
||||
| World reveal | **Complete** | `WorldRevealCoordinator` owns login/portal readiness and reveal lifetime (`a4ef5788`). The accepted deterministic lifecycle trace did not change after extraction. |
|
||||
| World reveal | **Complete** | `WorldRevealCoordinator` owns login/portal readiness, generation quiescence, and the exact streaming destination reservation. Login auto-entry and portal completion close only their active generation; stale completion cannot clear its replacement. Delayed portals retain the authored tunnel and centered retail wait notice rather than force-revealing incomplete content. |
|
||||
| Retained gameplay UI | **Mostly complete feature ownership** | `RetailUiRuntime` and focused panel/controllers own layout and behavior. `GameWindow.OnLoad` still performs substantial service composition, which is allowed until the final composition cleanup. |
|
||||
| Selection/interaction | **Complete** | `WorldSelectionQuery` owns read-only picking/classification/range queries; `SelectionInteractionController` owns selection intent, Use/PickUp transport, exact-incarnation queues, and auto-walk deferral; `ItemInteractionController` owns ItemHolder policy plus the shared retail inventory-request transaction. `GameWindow` retains construction and narrow lifecycle forwarding only. |
|
||||
| Landblock presentation | **Complete** | `LandblockBuildFactory` owns the captured-origin DAT transaction; concrete render/physics/DAT-static publishers and `LandblockPresentationPipeline` own publication and exact retryable retirement. `StreamingOriginRecenterCoordinator` serializes old-window retirement with teleport/session origin lifetimes. `GameWindow` retains construction and one pipeline field only (`c79d0a49`, closeout `4a205a3e`). |
|
||||
|
|
|
|||
|
|
@ -68,7 +68,7 @@ accepted-divergence entries (#96, #49, #50).
|
|||
|---|---|---|---|---|---|
|
||||
| AD-38 | Outgoing teleport viewports retire when retail's quantized animation level exceeds the last captured visible level 1022 (index 96), suppressing levels 1023/1024 up to 20.2 ms before retail's literal `elapsed >= 1.0` state edge. Incoming fades retain the exact timer. | `src/AcDream.Core/World/TeleportAnimSequencer.cs` (`OutgoingViewportReachedTerminalProjection`) | An uncapped 2000 FPS pass can publish the finite tunnel at levels 1023/1024 even though the paired 2013 retail capture switches viewports after 1022. The table-level cutover preserves the captured visible viewport ordering without throttling the application. | Exit sound, viewport replacement, and logout tunnel entry can occur at most two easing-table quanta (about 20.2 ms) earlier than retail's logical timer. | `UIGlobals::GetAnimLevel @ 0x004EE540`; `gmSmartBoxUI::UseTime @ 0x004D6E30`; paired retail/acdream captures documented in `docs/research/2026-07-15-retail-portal-space-pseudocode.md` |
|
||||
| AD-1 | Lost-cell machinery replaced by recoverable outdoor demote (**#107** safety net) + outdoor-restore `max(terrainZ, z)` under-terrain lift; retail goes `GotoLostCell` | `src/AcDream.Core/Physics/PhysicsEngine.cs:553` (+ :808) | acdream has no lost-cell state machine; outdoor landcell is the recoverable equivalent; the #107 auto-entry hold should make the demote branch unreachable | Gap in the hold → player committed to outdoor terrain inside/under a building (fake-grounded spawn, fall-through); a legit below-heightmap server restore is silently lifted — upward warp vs server | `GotoLostCell` pc:283418; `SetPositionInternal` 0x00515bd0, pc:283892-283945 |
|
||||
| AD-2 | Async readiness gates replace retail's synchronous destination cell load. **#229 refinement (2026-07-20):** login and F751 portal-space exit now share `WorldRevealReadinessBarrier`, so neither path can expose the normal viewport until the same render-publication, composite-texture, and collision domains converge. A hydratable indoor claim requires its owning Near-tier static/EnvCell mesh set, destination composites, and exact EnvCell physics (`IsSpawnCellReady`); an outdoor claim requires those render domains plus terrain/collision residency for the priority near ring. Hard-recenter generations and tier-aware completion application prevent stale overlapping loads/unloads or Far/Near jobs from opening or erasing the gate; mesh upload remains separate from balanced landblock ownership. Claims beyond NumCells still take the loud forced-placement path. `WorldRevealCoordinator` owns this shared lifetime; diagnostic telemetry observes its generation without defining another readiness path. **Slice E3 refinement (2026-07-24):** the same generation now publishes an immediate `WorldGenerationQuiescence` edge: old-world drawing/spatial queries, simulation/effect clocks, reconciliation, targeting, and 3-D audio stop while retained physical teardown advances through metered cursors and destination network/UI/streaming/readiness remain live. **Slice E4 refinement (2026-07-24):** accepted render/physics/static publication may span update frames through retained exact cursors, but reveal still consumes only the completed spatial/render-ready generation; building and EnvCell snapshots remain invisible until complete and the final spatial identity swap stays observer-atomic. The portal hold→materialize→regain-control lifecycle remains owned by `TeleportAnimSequencer`. | `src/AcDream.App/Streaming/WorldRevealCoordinator.cs`; `src/AcDream.App/Streaming/WorldGenerationQuiescence.cs`; `src/AcDream.App/Streaming/WorldRevealReadinessBarrier.cs`; `src/AcDream.App/Streaming/StreamingOriginRecenterCoordinator.cs`; `src/AcDream.App/Streaming/LandblockPresentationPipeline.cs`; `src/AcDream.App/Rendering/GameWindow.cs` (owner wiring + draw eligibility); `src/AcDream.App/Streaming/StreamingController.cs` (`IsRenderNeighborhoodResident`); `src/AcDream.App/Streaming/GpuWorldState.cs` (`IsRenderReady`); `src/AcDream.App/Rendering/Wb/LandblockSpawnAdapter.cs`; `src/AcDream.Core/Physics/PhysicsEngine.cs` (`IsSpawnCellReady`, `IsNeighborhoodTerrainResident`) | This is the asynchronous equivalent of retail leaving `SmartBox::position_update_complete` false while `CellManager::blocking_for_cells` is set: neither initial login nor portal arrival may reveal or continue simulating an old/partial collision world, a terrain-only Far shell, or a published-but-not-drawable GPU landblock. Indoor does not require a terrain heightmap, only the owning render landblock and exact EnvCell. | Gate opens early → grey/untextured first login or portal reveal, free-fall, wrong-cell rooting, missing scenery, or a still-active old generation; predicate never satisfies (streamer/DAT/upload failure) → login remains behind the world render gate, while portal transit reaches its existing loud timeout/forced-placement diagnostic. | `SmartBox::UseTime` 0x00455410; `gmSmartBoxUI::EndTeleportAnimation` 0x004D65A0 |
|
||||
| AD-2 | Async readiness gates replace retail's synchronous destination cell load. **#229 refinement (2026-07-20):** login and F751 portal-space exit now share `WorldRevealReadinessBarrier`, so neither path can expose the normal viewport until the same render-publication, composite-texture, and collision domains converge. A hydratable indoor claim requires its owning Near-tier static/EnvCell mesh set, destination composites, and exact EnvCell physics (`IsSpawnCellReady`); an outdoor claim requires those render domains plus terrain/collision residency for the required Near ring. Hard-recenter generations and tier-aware completion application prevent stale overlapping loads/unloads or Far/Near jobs from opening or erasing the gate; mesh upload remains separate from balanced landblock ownership. Claims beyond NumCells still take the loud unhydratable-placement path. `WorldRevealCoordinator` owns this shared lifetime; diagnostic telemetry observes its generation without defining another readiness path. **Slice E3 refinement (2026-07-24):** the same generation now publishes an immediate `WorldGenerationQuiescence` edge: old-world drawing/spatial queries, simulation/effect clocks, reconciliation, targeting, and 3-D audio stop while retained physical teardown advances through metered cursors and destination network/UI/streaming/readiness remain live. **Slice E4 refinement (2026-07-24):** accepted render/physics/static publication may span update frames through retained exact cursors, but reveal still consumes only the completed spatial/render-ready generation; building and EnvCell snapshots remain invisible until complete and the final spatial identity swap stays observer-atomic. **Slice E5 refinement (2026-07-24):** the reveal generation owns one exact destination reservation across every typed budget dimension. Stale completion cannot consume or clear its replacement, and hydratable incomplete content is never force-revealed; portal transit retains the DAT tunnel and centered retail wait cue until readiness converges. The hold→materialize→regain-control lifecycle remains owned by `TeleportAnimSequencer`. | `src/AcDream.App/Streaming/WorldRevealCoordinator.cs`; `src/AcDream.App/Streaming/WorldGenerationQuiescence.cs`; `src/AcDream.App/Streaming/WorldRevealReadinessBarrier.cs`; `src/AcDream.App/Streaming/StreamingOriginRecenterCoordinator.cs`; `src/AcDream.App/Streaming/LandblockPresentationPipeline.cs`; `src/AcDream.App/Streaming/StreamingController.cs`; `src/AcDream.App/Rendering/PortalTunnelPresentation.cs`; `src/AcDream.App/UI/PortalWaitNoticeController.cs`; `src/AcDream.App/Streaming/GpuWorldState.cs` (`IsRenderReady`); `src/AcDream.App/Rendering/Wb/LandblockSpawnAdapter.cs`; `src/AcDream.Core/Physics/PhysicsEngine.cs` (`IsSpawnCellReady`, `IsNeighborhoodTerrainResident`) | This is the asynchronous equivalent of retail leaving `SmartBox::position_update_complete` false while `CellManager::blocking_for_cells` is set: neither initial login nor portal arrival may reveal or continue simulating an old/partial collision world, a terrain-only Far shell, or a published-but-not-drawable GPU landblock. Indoor does not require a terrain heightmap, only the owning render landblock and exact EnvCell. | Gate opens early → grey/untextured first login or portal reveal, free-fall, wrong-cell rooting, missing scenery, or a still-active old generation; predicate never satisfies (streamer/DAT/upload failure) → login remains behind the world render gate, while portal transit remains in the authored tunnel and presents the centered wait cue after five seconds. | `SmartBox::UseTime` 0x00455410; `gmSmartBoxUI::UseTime` 0x004D6E30; `gmSmartBoxUI::EndTeleportAnimation` 0x004D65A0 |
|
||||
| AD-3 | Outdoor seeds always walk the transit array (retail skips the walk when the seed CLandCell is null/unloaded); per-cell lookups no-op on unhydrated data | `src/AcDream.Core/Physics/CellTransit.cs:503` | Equivalence argument: with nothing hydrated every lookup inside the walk no-ops, so the result matches retail's skipped walk | Near partially-streamed landblocks, building-transit promotion silently can't fire until structs hydrate — membership stays outdoor while the player is inside a building | `CObjCell::find_cell_list` 0052b535-0052b56c (null-CLandCell case) |
|
||||
| AD-4 | `point_in_cell` against an unhydrated CellBSP returns false (skip) rather than the null-node "inside" default; retail never queries unloaded cells | `src/AcDream.Core/Physics/CellTransit.cs:588` | The null-node default would make an unhydrated cell spuriously claim every point; skipping is the conservative streaming-safe choice | During hydration, a point genuinely inside a not-yet-loaded cell resolves outdoor/stale — transient membership misclassification driving wrong collision set and render root | `CEnvCell::find_visible_child_cell` :311397; cell-BSP vtable[0x84] |
|
||||
| AD-5 | Outdoor `point_in_cell` is an identity compare against the global XY-column cell from `LandDefs.AdjustToOutside` (no per-cell containment test) | `src/AcDream.Core/Physics/CellTransit.cs:865` | Landcells are disjoint 24 m columns — identity-compare against the column under the sphere centre is exactly equivalent to retail's per-candidate test | If block-origin/lcoord math is wrong at a landblock seam, the compare silently never matches — outdoor membership freezes at boundaries (the pre-#106 symptom) | `find_cell_list` pick pc:308788-308825; `CLandCell::point_in_cell` (get_block_offset pc:308804) |
|
||||
|
|
@ -212,7 +212,7 @@ AP-94..AP-112 for the confirmed retail-UI completion gaps.
|
|||
| AP-113 | Invalid lifestone-command arguments display the local text `Usage: /lifestone`; retail definitely emits a local usage/error line but Binary Ninja misidentifies the referenced wide-string address, so its exact wording is not yet recovered | `src/AcDream.UI.Abstractions/Panels/Chat/ChatCommandRouter.cs`; `RetailClientCommandCatalog.cs` | The behavior boundary is exact (handled locally, no chat and no game action); only a low-impact diagnostic sentence differs | `/ls now` can show different wording/color from retail while still refusing the invalid request correctly | `ClientCommunicationSystem::DoLifestone @ 0x0056FC70` |
|
||||
|
||||
| ~~AP-114~~ | **RETIRED 2026-07-14 (protection-effect corrective gate)** — the particle renderer no longer replaces every authored GfxObj with one bounding-box quad. Retail `Always2D` classification preserves mode-1/no-degrade full meshes through the modern shared mesh buffer and leaves only other degrade modes on the billboard path; stable emitter handles balance mesh ownership. | `src/AcDream.App/Rendering/ParticleRenderer.cs`; `RetailParticleGeometryClassifier.cs`; `particle_mesh.vert/.frag` | — | — | `CPhysicsPart::Draw @ 0x0050D7A0`; `CPhysicsPart::Always2D @ 0x0050D8A0`; `ParticleEmitter::SetInfo @ 0x0051CE90`; `docs/research/2026-07-13-retail-projectile-vfx-pseudocode.md` |
|
||||
| AP-115 | The DAT-authored portal-space viewport and its animation `SoundTweakedHook` are live, but the separate `ClientUISystem` enter/exit sound enums and centered repeating `"In Portal Space - Please Wait..."` display string are not yet presented. | `src/AcDream.App/Rendering/PortalTunnelPresentation.cs`; teleport event switch in `GameWindow.cs` | acdream has no retained cross-stack centered display-string owner or ClientUISystem sound-table-enum resolver yet; routing the line into chat or inventing direct wave IDs would be less faithful | Portal travel has the correct animated wormhole, timing, direct viewport switch, view-plane transitions, and animation-authored sound, but lacks retail's short UI cue sounds and center notice | `gmSmartBoxUI::BeginTeleportAnimation @ 0x004D6300`; `gmSmartBoxUI::UseTime @ 0x004D6E30` |
|
||||
| AP-115 | The DAT-authored portal-space viewport, animation `SoundTweakedHook`, and centered repeating `"In Portal Space - Please Wait..."` display string are live, but the separate `ClientUISystem` enter/exit sound enums are not yet presented. | `src/AcDream.App/Rendering/PortalTunnelPresentation.cs`; `src/AcDream.App/Streaming/LocalPlayerTeleportController.cs`; `src/AcDream.App/UI/PortalWaitNoticeController.cs` | acdream has no ClientUISystem sound-table-enum resolver yet; inventing direct wave IDs would be less faithful. The notice uses the retained fullscreen UI rather than chat and remains tied to the portal presentation lifetime. | Portal travel has the correct animated wormhole, timing, direct viewport switch, view-plane transitions, animation-authored sound, and centered wait notice, but lacks retail's short UI enter/exit cue sounds. | `gmSmartBoxUI::BeginTeleportAnimation @ 0x004D6300`; `gmSmartBoxUI::UseTime @ 0x004D6E30` |
|
||||
| AP-116 | Default `Particle Range = Extended` multiplies DAT-authored particle degradation distances by 2; the `Retail` option restores exact values | `src/AcDream.UI.Abstractions/Panels/Settings/DisplaySettings.cs`; `src/AcDream.App/Rendering/Vfx/ParticleVisibilityController.cs`; `src/AcDream.Core/Vfx/ParticleSystem.cs` | User explicitly requested doubled range as the normal non-dev-UI behavior; it changes no terrain, scenery, entity, fog, or streaming distance, and remains reversible through settings | The default roughly enlarges the active particle area and reduces the CPU gain from MP2; distant VFX remain visible beyond retail's authored cutoff | `CPhysicsPart::GetMaxDegradeDistance @ 0x0050D510`; `GfxObjDegradeInfo::get_max_degrade_distance @ 0x0051E2D0`; `CPhysicsObj::ShouldDrawParticles @ 0x0050FE60` |
|
||||
| AP-117 | Outdoor particle `CLandCell::IsInView` state is reconstructed with the modern landscape renderer's per-cell frustum plus active doorway clip-plane/scissor-AABB tests; retail `LScape::landcell_check` uses `Render::get_clip_height` + `Render::block_check` on terrain-cell corner intervals | `src/AcDream.App/Rendering/TerrainModernRenderer.cs` (`CollectVisibleCells`) | The mandatory modern renderer batches terrain by landblock and has no retail `ViewIntervalType` product. Publishing cell visibility from the exact landscape draw slices preserves ownership/order and removes the former object-survivor dependency without adding a second view pipeline | At a terrain cell grazing a frustum or doorway boundary, the conservative AABB test may freeze or resume particles on a slightly different frame than retail; whole regions outside the active doorway slice are rejected, and authored distance, login/portal fail-closed behavior, and indoor PView cells remain exact | `LScape::landcell_check @ 0x005050A0`; `CLandCell::IsInView @ 0x00532CB0`; `CPhysicsObj::ShouldDrawParticles @ 0x0050FE60` |
|
||||
| AP-118 | An AutoWield transaction begun in active combat preserves the ready mode implied by the requested weapon. After authoritative `WieldObject`, a mode that settled without a blocker transition clears immediately; local ACE's observed pre-wield transition plus `ready -> NonCombat`, or post-wield `NonCombat -> ready -> NonCombat`, causes one normal `ChangeCombatMode` request from the trailing notice. Explicit user combat input cancels settlement. Retail's client does not need this extra request against the retail server. | `src/AcDream.App/UI/AutoWieldController.cs`; production binding in `GameWindow.cs` | Local ACE queues a trailing NonCombat callback during primary-weapon replacement and rejects an earlier request while the shuffle is busy; responding to the authoritative notice that completes that exact sequence orders the ordinary request after it without suppressing any server state | A non-ACE server that emits a different intermediate sequence can retain the settlement until a later explicit combat request, replacement, or logout clears it; peace-mode equips send none | `CPlayerSystem::AutoWield @ 0x00560A60`; `ACCWeenieObject::ServerSaysMoveItem @ 0x0058DBB0`; ACE `Player_Inventory.TryShuffleStance` / `TryDequipObjectWithNetworking` |
|
||||
|
|
|
|||
|
|
@ -1613,11 +1613,14 @@ port in any phase — no separate listing here.
|
|||
> generation unavailable at the hard reveal edge and freezes its world
|
||||
> simulation/audio while full-window and shared-origin teardown advance through
|
||||
> metered resident, entity, and owner-stage cursors with exact retry receipts.
|
||||
> E4 now retains the exact accepted queue head and cursor-budgets render,
|
||||
> E4 retains the exact accepted queue head and cursor-budgets render,
|
||||
> physics, static, building-registry, EnvCell, collision, and reflood
|
||||
> publication before one observer-atomic spatial swap. E5 destination
|
||||
> reservation/reveal joining is next. F/G and J retain their explicit approval
|
||||
> gates.
|
||||
> publication before one observer-atomic spatial swap. E5 now joins the
|
||||
> canonical reveal generation to an exact destination reservation, protects
|
||||
> its share across all typed budget dimensions, removes forced incomplete
|
||||
> materialization, and presents retail's centered five-second portal wait cue.
|
||||
> E6 deterministic pressure and physical-local closeout is next. F/G and J
|
||||
> retain their explicit approval gates.
|
||||
|
||||
**Spec:** `docs/superpowers/specs/2026-07-05-modern-pipeline-design.md` (the
|
||||
umbrella design — read it first). **Goal:** smoothness first (no frame over
|
||||
|
|
|
|||
|
|
@ -93,13 +93,17 @@ The separately authorized modern-runtime performance program has completed
|
|||
Slices A–D: corrected measurement, prepared-package bake/dedup, package-only
|
||||
production streaming, and typed unified residency. Its physical capped,
|
||||
uncapped, and dense connected gates pass without a visual-quality change.
|
||||
Slice E0–E4 now define and enforce typed completion admission through explicit
|
||||
Slice E0–E5 now define and enforce typed completion admission through explicit
|
||||
stable priority queues, publish an immediate generation-scoped old-world
|
||||
quiesce at login/portal boundaries, and advance full-window/recenter teardown
|
||||
through exact metered retirement cursors. Render, physics, static, building,
|
||||
and EnvCell publication now resume from retained exact cursors under the same
|
||||
frame budget. E5 destination reservation and reveal-generation joining is
|
||||
next. Slices F/G remain behind their explicit ECS approval gate, and Slice J
|
||||
frame budget. The reveal coordinator now owns the exact destination
|
||||
generation/cell/radius reservation across every budget dimension; portal
|
||||
transit never force-reveals incomplete content and surfaces retail's centered
|
||||
wait cue after five seconds. E6 deterministic pressure and physical-local
|
||||
closeout is next. Slices F/G remain behind their explicit ECS approval gate,
|
||||
and Slice J
|
||||
remains behind its gameplay-owner approval gate.
|
||||
|
||||
Slice 1's 18-cell favorite-spell overflow bar is user-accepted. Slice 2's
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
**Date:** 2026-07-24
|
||||
|
||||
**Status:** Slices A–D complete. Slice E is active (E0–E4 complete).
|
||||
**Status:** Slices A–D complete. Slice E is active (E0–E5 complete; E6 gates next).
|
||||
|
||||
**Scope:** Reconcile and sequence the existing Modern Pipeline (`MP`) and
|
||||
Linux/headless (`LH`) tracks using the 2026-07-24 connected performance audit.
|
||||
|
|
@ -729,9 +729,13 @@ checkpoint retained staged or retiring bytes. Evidence:
|
|||
**Checkpoint 2026-07-24:** E0 fixed the retail/adaptation contract and current
|
||||
owner inventory. E1 landed the validated work profile, deterministic meter and
|
||||
completion charge model. E2 cut execution over to stable priority FIFOs. E3
|
||||
added immediate generation quiescence and cursored retirement. E4 now advances
|
||||
render/physics/static publication from retained exact receipts; E5 destination
|
||||
reservation and reveal-generation joining is next.
|
||||
added immediate generation quiescence and cursored retirement. E4 advances
|
||||
render/physics/static publication from retained exact receipts. E5 replaced
|
||||
mutable priority-radius state with the reveal coordinator's exact
|
||||
generation-scoped destination reservation, protected its share across every
|
||||
typed budget dimension, removed forced early materialization, and added
|
||||
retail's centered five-second portal wait cue. E6 deterministic pressure and
|
||||
physical-local closeout is next.
|
||||
|
||||
**Purpose:** Remove update-thread portal transactions.
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# Modern Runtime Slice E — Cost-budgeted streaming and retirement
|
||||
|
||||
**Status:** active — E0/E1/E2/E3/E4 complete; E5 destination reservation next
|
||||
**Status:** active — E0/E1/E2/E3/E4/E5 complete; E6 gates and closeout next
|
||||
**Program:** `docs/plans/2026-07-24-modern-runtime-architecture.md`
|
||||
**Baseline:** Slice D closeout commit `66690805`
|
||||
**Behavior contract:** no visual-quality or retail-behavior reduction
|
||||
|
|
@ -356,6 +356,35 @@ performance and visual evidence remains an E6 gate.
|
|||
five seconds.
|
||||
- Remove the last count-only execution/bypass paths.
|
||||
|
||||
**Complete 2026-07-24.** `WorldRevealCoordinator` now owns one exact
|
||||
generation/cell/radius reservation from login or portal begin through complete
|
||||
or cancel. `StreamingController` no longer exposes a mutable priority
|
||||
landblock/radius pair: accepted work records the reveal generation that
|
||||
classified it, stale completion cannot consume a replacement generation's
|
||||
reserved lane, and stale teardown cannot clear the replacement reservation.
|
||||
The frame meter records destination and non-destination use independently and,
|
||||
while a reveal is active, protects the configured destination share across
|
||||
wall time, completion admissions, adopted CPU bytes, entity operations,
|
||||
requested GPU bytes, and GL-retirement admissions. Destination work still
|
||||
uses the same global ceilings and the existing first-indivisible-operation
|
||||
progress diagnostic; it does not regain a budget bypass.
|
||||
|
||||
The former ten-second forced materialization path is deleted. An incomplete
|
||||
destination remains in the authored portal scene until the canonical render,
|
||||
composite, and collision predicate is true. After five seconds the retained
|
||||
gameplay UI displays retail's centered
|
||||
`"In Portal Space - Please Wait..."` notice and lifecycle telemetry records the
|
||||
cue once; the tunnel continues its DAT animation and repeats the notice on the
|
||||
retail camera-rotation cadence. Login completion now ends its reveal
|
||||
reservation/quiescence at the same auto-entry edge that exposes the ready
|
||||
world.
|
||||
|
||||
Validation: 91 focused reservation/reveal/teleport/UI tests passed; the
|
||||
complete App suite passed 3,674 / 3 skipped; the complete Release solution
|
||||
passed 8,158 / 5 skipped; Release solution build green with zero warnings.
|
||||
The physical-local routes and final performance/resource assertions remain
|
||||
E6, not E5.
|
||||
|
||||
### E6 — Gates and closeout
|
||||
|
||||
- Deterministic pressure, reentrancy, failure, cancellation, stale-generation,
|
||||
|
|
|
|||
|
|
@ -109,7 +109,7 @@ Required asynchronous equivalent:
|
|||
```text
|
||||
WorldRevealReady(destination):
|
||||
if destination claim cannot be hydrated:
|
||||
return true so the existing loud forced-placement path diagnoses it
|
||||
return true so the loud unhydratable-placement path diagnoses it
|
||||
|
||||
if destination is indoor:
|
||||
return render center landblock Near-tier and ready
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@
|
|||
- `CObjectMaint::DestroyObjects @ 0x00508C30`
|
||||
- `CObjectMaint::AddObjectToBeDestroyed @ 0x00508F70`
|
||||
- `SmartBox::UseTime @ 0x00455410`
|
||||
- `gmSmartBoxUI::UseTime @ 0x004D6E30`
|
||||
|
||||
The Sept 2013 named pseudo-C is the behavioral oracle. WorldBuilder has no
|
||||
equivalent live-client teardown scheduler; its extracted mesh/cache owners are
|
||||
|
|
@ -125,6 +126,37 @@ object maintenance, physics, landscape, game time, or ambient sound. UI/event
|
|||
dispatch and the portal presentation continue. This is the retail basis for
|
||||
Slice E's immediate old-generation quiesce.
|
||||
|
||||
## `gmSmartBoxUI::UseTime` portal wait presentation
|
||||
|
||||
The portal `CreatureMode` remains live while `SmartBox` is blocked. Its camera
|
||||
continues one random roll segment at a time:
|
||||
|
||||
```text
|
||||
if now >= rotationStart + rotationDuration:
|
||||
currentAngle = rotationEndAngle
|
||||
rotationStart = now
|
||||
rotationDuration = RandomUniform(0.6, 1.8) seconds
|
||||
rotationStartAngle = currentAngle
|
||||
rotationEndAngle = RandomUniform(0, 360) degrees
|
||||
ECM_UI.SendNotice_DisplayStringInfo(
|
||||
channel = 0x1A,
|
||||
text = "In Portal Space - Please Wait...")
|
||||
else:
|
||||
level = UIGlobals.GetAnimLevel(
|
||||
(now - rotationStart) / rotationDuration)
|
||||
currentAngle = Lerp(
|
||||
rotationStartAngle,
|
||||
rotationEndAngle,
|
||||
level / 1024)
|
||||
|
||||
CreatureMode.SetCameraDirection_Degrees((0, currentAngle, 0))
|
||||
```
|
||||
|
||||
The notice is a centered UI display string, not chat. Slice E's asynchronous
|
||||
adaptation delays its first projection until the recorded five-second reveal
|
||||
stall threshold, then repeats it on the same rotation-segment boundary while
|
||||
the authored tunnel keeps animating.
|
||||
|
||||
## Acdream asynchronous adaptation
|
||||
|
||||
Retail performs each teardown synchronously and can synchronously block cell
|
||||
|
|
@ -156,6 +188,12 @@ reveal only when the one destination-generation readiness state proves:
|
|||
required Near scene ready
|
||||
required composite textures ready
|
||||
camera/player identity belongs to destination generation
|
||||
|
||||
if the portal reveal is still incomplete after five seconds:
|
||||
keep the DAT-authored portal scene animating
|
||||
display the centered retail wait notice
|
||||
emit one generation-scoped diagnostic
|
||||
do not materialize early
|
||||
```
|
||||
|
||||
Release-later never means run-later: an old owner may retain memory until its
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue