From 9d65087c79c233d426aad10ec158efc4190a0bfa Mon Sep 17 00:00:00 2001 From: meleki Date: Wed, 30 Sep 2026 09:45:07 +0200 Subject: [PATCH] Explain the performance overlay in the Game View (#275) - Concepts: new paragraph Performance with a table of what each line counts. - Architecture: how the frame is measured, and that Chromium rounds performance.now() to 0.1 ms. The mean over about 30 frames smooths that out. - Development: the e2e total is now 1601. --- Architecture.md | 10 ++++++++++ Concepts.md | 18 ++++++++++++++++++ Development.md | 2 +- 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/Architecture.md b/Architecture.md index d7a5df6..27b0acc 100644 --- a/Architecture.md +++ b/Architecture.md @@ -357,6 +357,16 @@ the same number to tests. It counts **drawn** frames over the time the renderer idle seconds are not slow seconds, so the readout answers "how smooth is it while it moves" and holds its last answer while nothing needs drawing, instead of falling to zero when all is well. +The performance overlay of the Game tab (#275) is fed by `FrameMeter` (`editor/frameMeter.ts`, +pure and unit tested). While playing, `World.timeSystem` is set and the world times each system it +ticks with `performance.now()`; `PlaySession` sorts them into behaviors, physics and animation. +`GameViewport` adds up what its `redraw` takes, and `ui/render.ts` keeps what the last +`app.render()` took (`lastRenderTime`). Both together are *Drawing*. `Editor.tick` times itself; +what is left of that once the systems and the game's redraw are taken off is *Editor*. The meter +averages per frame over 0.5 s, the window of the fps readout. The released game leaves +`timeSystem` unset, so the world runs untimed there. Browsers round `performance.now()` (Chromium +to 0.1 ms without cross-origin isolation), which the average over some 30 frames smooths out. + Rules that keep it organised: `core/` imports nothing from other layers; `ui/` never sees assets; position exists only on scene objects; overrides are merged in exactly one place (`core/properties/resolve.ts`); the inspector is generated from `PropertySchema` — a new diff --git a/Concepts.md b/Concepts.md index 4323e76..cd7a460 100644 --- a/Concepts.md +++ b/Concepts.md @@ -96,6 +96,24 @@ screen, so Balanced lets them keep up with every frame. Under Minimal they are h pulse glows for 0.35 s, longer than the gap between two updates, so every pulse still shows. Balanced is also what a project written before there was a choice plays with. The preset is saved with the project and is an undo step. +**Performance** (#275). The **Performance** button in the Game tab's header switches an overlay in +the top left corner of the game view. It shows while a game runs, and only then: the frame rate, +how many entities the world has, and where the time of a frame goes, in milliseconds per frame +averaged over half a second: + +| Line | What it counts | +|---|---| +| **Behaviors** | The behavior graphs and state machines | +| **Physics** | The physics step and the contacts it finds | +| **Animation** | Advancing the animations | +| **Drawing** | Building the game's picture and handing the frame to the GPU | +| **Editor** | Everything else the editor does in the frame: writing the run into the model, the panels, the console | + +A dash stands for what has not been measured yet, in the first half second of a run. The numbers +are what the main thread spends; the GPU works on after that, and its time is not in them. The +switch is not saved and stays as it is until the page is loaded again. A released game has no +overlay. + **Snapshots** (#231). *Menu → Snapshots…* lists the snapshots of the open project, newest first, with the local time each was made. **Create snapshot** copies the project as the server has it stored, under the name typed or, left blank, under the date and time; the autosave is written diff --git a/Development.md b/Development.md index 3fe3862..4cf8bbf 100644 --- a/Development.md +++ b/Development.md @@ -18,7 +18,7 @@ php tests/php/accounts.test.php # the API's accoun # has and the web server's container has not (SKIP there) php tests/php/snapshots.test.php # the snapshot store (#231), the same way php tests/php/releases.test.php # the release store (#266), the same way -node tools/seed-e2e.mjs && node tools/e2e.mjs # 1596 editor checks, screenshots in /tmp/gm-e2e-*.png +node tools/seed-e2e.mjs && node tools/e2e.mjs # 1601 editor checks, screenshots in /tmp/gm-e2e-*.png GM_STEPS=20 node tools/e2e.mjs # or 1-12, or 6,20 — a subset while working on one step ./e2e.sh start [GM_STEPS] # the same run detached, see below ./e2e.sh status # live progress, or the last run's result