Refresh STATUS.md/ROADMAP.md for the Scene.set()/UI caching/CI work

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-31 13:53:06 -05:00
parent 8f8fa8f8d1
commit df9fdf26c8
2 changed files with 57 additions and 25 deletions
+26 -12
View File
@@ -13,10 +13,15 @@ for a memory/CPU optimization survey specifically targeting the PSP build
3. Update entity interaction, triggers, chunk management, and other 3. Update entity interaction, triggers, chunk management, and other
systems that currently assume tile-based positioning so they work systems that currently assume tile-based positioning so they work
with the new 3D positioning/movement code. with the new 3D positioning/movement code.
4. Investigate and fix poor UI rendering performance. Rendering the 4. Investigate and fix poor UI rendering performance. First pass done
console alone tanks framerate despite the existing mesh (2026-07-31): slider/tab/frame/textbox now cache their sprite
optimizations, so there is likely more headroom to find in the geometry instead of rebuilding it every frame, and the console's
vertex/text rendering path. vertex buffer is fixed-size instead of alloc/free churn (see
`STATUS.md`'s "UI rendering performance" note for detail). Still
open: per-widget material/color changes still force a sprite-batch
flush each time (color is per-material, not per-vertex), so a row of
alternating highlighted widgets still costs one draw call per
widget.
5. Create UI elements for displaying status indicators, e.g. network 5. Create UI elements for displaying status indicators, e.g. network
connection state and save-in-progress. connection state and save-in-progress.
6. Fully test saving end-to-end on all supported platforms. 6. Fully test saving end-to-end on all supported platforms.
@@ -62,14 +67,23 @@ fix:
`docker/vita/` reference `-DDUSK_TARGET_SYSTEM=vita`, but no `docker/vita/` reference `-DDUSK_TARGET_SYSTEM=vita`, but no
`cmake/targets/vita.cmake` exists, so the build is currently broken. `cmake/targets/vita.cmake` exists, so the build is currently broken.
Either implement it or remove the dangling scripts/Dockerfile. Either implement it or remove the dangling scripts/Dockerfile.
4. Add per-PR CI build coverage for at least one non-Linux target (PSP, 4. Per-PR CI build coverage for non-Linux targets: first pass added
Knulli, GameCube, Wii currently only build on tag push, so 2026-07-31 as `run-tests-gamecube-dolphin`/`run-tests-wii-dolphin`
regressions there are invisible until a release). (build the ISO, boot it in Dolphin under Xvfb) and
5. Tackle milestone 4 above (poor UI rendering performance) with a `run-tests-psp-ppsspp` (build the EBOOT, boot it in PPSSPPHeadless)
concrete lead: extend `uiconsole.c`'s cached-mesh pattern (rebuild in `.github/workflows/test.yml`, plus matching
only on dirty) to the general widget framework `scripts/test-*-dolphin.sh`/`scripts/test-psp-ppsspp.sh` (+ `-docker`
(`uiframe.c`/`uilabel.c`/buttons/menus), which currently rebuilds and variants). Marked `continue-on-error: true` since none of these have
re-uploads geometry via `spriteBatchBuffer`/`meshFlush` every frame. actually been exercised on a real runner yet -- verify they pass
before relying on them, and drop the flag once they do. Knulli still
has no per-PR coverage at all.
5. Milestone 4 above (poor UI rendering performance) has a first pass
in (2026-07-31, see `STATUS.md`) -- remaining concrete lead: sprite
batch flushes are keyed on shader+material (including tint color),
so per-widget color changes (e.g. focus highlight) still force a
flush per widget; moving tint to per-vertex color would let a whole
row of widgets batch into one draw call regardless of highlight
state.
6. Revisit the GameCube/Wii networking static-IP workaround in 6. Revisit the GameCube/Wii networking static-IP workaround in
`networkdolphin.c` -- it's standing in for an unresolved suspected `networkdolphin.c` -- it's standing in for an unresolved suspected
memory-corruption bug in `if_config()`'s DHCP path. memory-corruption bug in `if_config()`'s DHCP path.
+31 -13
View File
@@ -6,14 +6,14 @@ whenever picking a new roadmap milestone) rather than trusting it blindly.
See `ROADMAP.md` for the ordered feature milestones this status feeds into, See `ROADMAP.md` for the ordered feature milestones this status feeds into,
and `CLAUDE.md` for coding conventions. and `CLAUDE.md` for coding conventions.
Last surveyed: 2026-07-30, at commit `e61914ba`. Last surveyed: 2026-07-31, at commit `8f8fa8f8`.
## Core engine (`src/dusk/`) ## Core engine (`src/dusk/`)
| Subsystem | Maturity | Notes | | Subsystem | Maturity | Notes |
|------------|------------------------------------|-------| |------------|------------------------------------|-------|
| asset | Mature, fully wired | Model loading's "async" path is actually synchronous (`assetmodelloader.h`) -- only real stub found in core. | | asset | Mature, fully wired | Model loading's "async" path is actually synchronous (`assetmodelloader.h`) -- only real stub found in core. |
| script | Mature for its current scope | Registered modules: `modulePlatform`, `moduleComponent`, `moduleEntity`, `moduleScene` only. No typed per-component JS wrappers (all components go through the generic `Component`). No unit tests. | | script | Mature for its current scope | Registered modules: `modulePlatform`, `moduleComponent`/`moduleComponentList` (typed Position/Physics/Renderable wrappers), `moduleEntity`, `moduleScene` (with `Scene.set()` module lifecycle), `moduleMesh`, `moduleTime`, `moduleRequire` (CommonJS-style `require()`/`module.exports`). Entry point is `scripts/init.js`, which does `require('./overworldscene.js')` + `Scene.set()`. Has unit tests (`test/script/`). |
| entity | Mature | Engine-level prefab lists are empty sentinels; all real prefabs live in `duskrpg`. | | entity | Mature | Engine-level prefab lists are empty sentinels; all real prefabs live in `duskrpg`. |
| scene | Mature | Same prefab-delegation pattern as entity. No JSON serialize/deserialize (removed by design). | | scene | Mature | Same prefab-delegation pattern as entity. No JSON serialize/deserialize (removed by design). |
| save | Mature, but undocumented | Slot-based, yyjson + CRC32, platform stream hooks. Not covered in `CLAUDE.md`, no tests. | | save | Mature, but undocumented | Slot-based, yyjson + CRC32, platform stream hooks. Not covered in `CLAUDE.md`, no tests. |
@@ -21,21 +21,39 @@ Last surveyed: 2026-07-30, at commit `e61914ba`.
| physics | Mature, recently churned | Recent revert/re-disable of "old ent code" suggests component wiring around physics isn't fully settled. Well tested. | | physics | Mature, recently churned | Recent revert/re-disable of "old ent code" suggests component wiring around physics isn't fully settled. Well tested. |
| animation | Early/mid-stage | Keyframes + easing only, no blend trees or state machines. Terse commit history ("ANIM") suggests still iterating. | | animation | Early/mid-stage | Keyframes + easing only, no blend trees or state machines. Terse commit history ("ANIM") suggests still iterating. |
| display | Most mature/battle-tested | Backbone of the engine; dominated by platform optimization commits. | | display | Most mature/battle-tested | Backbone of the engine; dominated by platform optimization commits. |
| ui | Actively churning | Widget framework has had features added and ripped out repeatedly (story/battle UI added then removed). Rendering path is the likely root cause of roadmap item 4 (see below). No tests at all. | | ui | Actively churning, perf pass done | Widget framework has had features added and ripped out repeatedly (story/battle UI added then removed). No JS bindings yet (from-scratch surface if that's picked up). Sprite-cache pass landed for slider/tab/frame/textbox (see roadmap item 4 below); still no scripted pointer/hit-testing. Has unit tests for the new caching logic (`test/ui/`), but nothing exercises actual draw calls -- see below. |
| console | Small, finished for its scope | Already has the cached-mesh optimization pattern the rest of `ui/` lacks. | | console | Small, finished for its scope | Fixed-size cached mesh (no more alloc/free churn), same pattern the rest of `ui/` now follows. |
| event | Clean, small, finished | Pub/sub, rebuilt to replace the old input system. | | event | Clean, small, finished | Pub/sub, rebuilt to replace the old input system. |
| game | Intentionally header-only | Real implementation lives in `duskrpg/game/game.c`. | | game | Intentionally header-only | Real implementation lives in `duskrpg/game/game.c`. |
### UI rendering performance (roadmap item 4) ### UI rendering performance (roadmap item 4)
Confirmed root-cause candidate: `src/dusk/ui/debug/uiconsole.c` caches a First pass landed 2026-07-31: `uislider`/`uitab` now cache their non-text
persistent mesh and only rebuilds on dirty/scroll change. The rest of the quads (track/fill/markers, tab background) relative to origin and only
widget framework (`uiframe.c`, `uilabel.c`, buttons, menus, settings rebuild on state change, translating into position at draw time.
screens) still goes through `spriteBatchBuffer`/`spriteBatchFlush` and `uiframe.c` grew `uiFrameDrawCached()`, which skips rebuilding its 9-slice
re-uploads vertex data via `meshFlush` every frame, with a full flush sprites when x/y/width/height match the last call; wired into the
forced on every shader/material change. This is almost certainly what confirm dialog, settings panel, and textbox (each owns its own
"tanks framerate" on PSP. Fix direction: extend the console's cached-mesh `uiframecache_t`). `uitextbox` no longer does one `spriteBatchBuffer` call
pattern to the general widget path (rebuild only on dirty, not every per visible glyph -- it builds a per-page glyph cache once and slices a
frame). prefix by scroll each frame. `uiconsole` dropped its alloc/free vertex
buffer for a fixed 512-glyph array. `uifps` skips its label rebuild when
the formatted FPS string hasn't changed.
Still open: every widget still issues its own `spriteBatchBuffer` call
per material/color, so a row of alternating highlighted/plain widgets
still forces a GPU flush per widget (color is applied via material, not
per-vertex) -- that's the next real win if PSP framerate is still an
issue. No scripted pointer/hit-testing exists either; input is still
100% gamepad/keyboard directional-focus (`ui/focus/`).
Test coverage caveat: `test/ui/` and `test/display/test_spritebatchsprite.c`
cover the new caching *logic* (geometry math, exercised by constructing
widget structs directly) but cannot exercise `uiXxxDraw()`/`uiFrameDraw()`
themselves -- those need `FONT_DEFAULT`/`UI_FRAME`'s GL texture, which
needs a live GL context this test binary doesn't have (confirmed: calling
`fontInitDefault()` in a test asserts in `texturegl.c`). This is true of
the whole rendering layer, not something newly introduced -- there's no
GL-backed test harness anywhere in the repo yet.
## Game layer (`src/duskrpg/`) ## Game layer (`src/duskrpg/`)