fix(G.3): pre-collapse dungeon streaming at login/teleport — kill the login FPS ramp (#135)
On login (or teleport) into a dungeon, FPS started ~10 and climbed over ~30 s. Root cause: the dungeon "collapse" (which shrinks the 25x25 streaming window to the player's single dungeon landblock — AC dungeons have no neighbours) only fires once the per-frame `insideDungeon` gate reads true, and that gate keys on the physics CurrCell, which isn't set until the player is PLACED, which waits for the dungeon landblock to hydrate. So during the whole hydration window NormalTick bootstraps the full window — ~24 unrelated ocean-grid neighbour dungeons + their ~19k entities each — and the collapse only mops them up afterward. That mop-up is the ramp. Fix: trigger the SAME collapse early, the instant we recenter the streaming center onto a sealed dungeon cell, before the first NormalTick. - StreamingController.PreCollapseToDungeon(cx,cy): fires EnterDungeonCollapse early (idempotent). The expensive neighbour window is never enqueued. - GameWindow.IsSealedDungeonCell(cellId): reads the EnvCell dat SeenOutside flag (CurrCell is null pre-placement) — the same flag ObjCell.SeenOutside and the per-frame gate use, so the early decision matches the eventual one. Distinguishes a real dungeon from a cottage/inn interior (SeenOutside → keeps its outdoor surround). Excludes the 0xFFFE/0xFFFF structural shell ids so an outdoor spawn id can't type-confuse a LandBlock record as an EnvCell. - Hooks: OnLiveEntitySpawnedLocked (login) + OnLivePositionUpdated (teleport). - Observer robustness: during a teleport PortalSpace hold the streaming observer follows the recentered destination, not the frozen pre-teleport position (which could drift >=2 landblocks off and trip ExitDungeonExpand). And _lastLivePlayerLandblockId is now filtered to the player guid (resolves the Phase A.1 TODO) so a stray NPC UpdatePosition can't drift the login-hold observer off the dungeon. Faithful EARLY trigger of the existing AP-36 collapse mechanism, not a new workaround — AP-36 amended in the same commit. Adversarially reviewed across timing / threading / faithfulness lenses; 5 new tests including the real runtime ordering (Tick bootstraps, then PreCollapse cancels). Core suite green (1463). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
a100bc37a7
commit
712f17f0f2
5 changed files with 231 additions and 7 deletions
|
|
@ -48,11 +48,27 @@ Copy this block when adding a new issue:
|
|||
|
||||
## #135 — ~30 s low-FPS ramp at login (≈10 fps → high) before streaming settles
|
||||
|
||||
**Status:** OPEN
|
||||
**Status:** FIX LANDED — pending visual gate (login into the 0x0007 dungeon → FPS steady in ~1–2 s, no neighbour load/unload churn)
|
||||
**Severity:** LOW (startup-only; self-corrects)
|
||||
**Filed:** 2026-06-14
|
||||
**Component:** streaming — first-frame bootstrap vs the dungeon collapse
|
||||
|
||||
**FIX (2026-06-14):** pre-collapse streaming the instant we recenter onto a SEALED
|
||||
dungeon cell at login/teleport, before the first `NormalTick` bootstraps the window.
|
||||
- `StreamingController.PreCollapseToDungeon(cx,cy)` — fires the existing `EnterDungeonCollapse`
|
||||
early (idempotent), so the expensive ocean-grid neighbour window is never enqueued
|
||||
(teleport) / is enqueued-then-immediately-cleared for a cheap Holtburg frame (login).
|
||||
- `GameWindow.IsSealedDungeonCell(cellId)` — reads the `EnvCell` dat `SeenOutside` flag
|
||||
(the same flag the hydrated `ObjCell.SeenOutside` + the per-frame gate use) so a cottage/inn
|
||||
interior keeps its outdoor surround; excludes the 0xFFFE/0xFFFF shell ids.
|
||||
- Hooks in `OnLiveEntitySpawnedLocked` (login) + `OnLivePositionUpdated` (teleport).
|
||||
- Observer robustness: during a teleport `PortalSpace` hold the observer follows the
|
||||
recentered destination (not the frozen position); `_lastLivePlayerLandblockId` is now
|
||||
filtered to the player guid (resolving a Phase A.1 TODO) so a stray NPC update can't drift
|
||||
the login-hold observer off the dungeon and trip `ExitDungeonExpand`.
|
||||
Adversarially reviewed (3 lenses); register row AP-36 amended. Tests in
|
||||
`StreamingControllerDungeonGateTests` (5 new, incl. the real Tick-then-PreCollapse ordering).
|
||||
|
||||
**Description:** On login into a dungeon, FPS starts ~10 and climbs over ~30 s before
|
||||
settling (then 1000+ fps). User: "we still have about 30ish seconds before FPS is ramped
|
||||
up; when logging in I get like 10 then it slowly increases."
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue