Files
gig-line/Docs/release-checks.md
T
zwitschi 73bce53a2b feat(hud): F3 debug overlay — FPS, frame time, worst frame, state
A top-left readout for performance work: smoothed FPS and frame time, the worst
frame in a rolling two-second window, the active view, player speed, a frame counter
and the player's position in metres from the project origin.

- **F3** toggles it, through the console variable  so a packaged build
  can be checked without a rebuild ().
- **On automatically** for  and , so the performance capture never
  depends on pressing a key first; **off in the built demo**, because a player should
  not see an FPS counter over Hollywood Boulevard.
- The first two seconds are a **warm-up window** excluded from the worst-frame figure.
  Without it the readout showed 'worst 400 ms' for a healthy run: the startup shader
  and streaming hitches dominated the rolling maximum.

Measured cost on the self-test route at 1440p: 2.64 -> 2.77 ms average, about 5 %,
still 6x the floor. The release-check number stays the overlay-off run; the overlay-on
series is committed beside it as Docs/perf/0.2.0-walk-frametimes-overlay.csv.

Docs: controls (F3 row, overlay section, switch table), release checks (cost row),
architecture building block view (HUD and input list).
2026-11-09 12:40:48 +01:00

16 KiB
Raw Blame History

Release checks

Every version in TODO.md ends with release checks, and the scope and goal of each version are in ROADMAP.md. A version is not tagged until all of its checks pass. If a check fails, do not tag; open a patch task in TODO.md and report the failing check in CHANGELOG.md.

Record results in the table at the end of this file, with the date, the exact build under test, and the evidence (screenshot, log, or command output). A check without recorded evidence counts as failed.

General checks (every release)

  1. Blender pre-check (before the engine pass). Art/blender/site/site_assembly.py raycasts both sidewalks and the designated crossing on a 1 m grid and reports holes and step heights. It is evidence, not the check: the engine traversal below is still required.

  2. Fresh checkout builds. Clone into a clean directory, git lfs pull, build and package using only the documented external engine installation. No machine-specific paths, no uncommitted steps.

  3. No packaging errors. The packaged build launches, reaches gameplay, and quits cleanly. Logs contain no missing-asset, missing-map, or shader-compile errors.

  4. Licensing. Every new asset has provenance in THIRD_PARTY_NOTICES.md, or is recorded as unresolved and kept out of the build.

  5. Version discipline. Patch releases contain fixes, optimisation, docs, or tuning only — no new scope.

0.1.0 checks

  1. Realism first. Building placement, street width, sidewalk depth, material read and site identity match the reference photography. Compare side by side and note every deliberate deviation. "Looks right" is not evidence.
  2. Player traverses both the south-side frontage and the north-side frontage of the demo without falling through geometry, including the designated crossing. Walk the route twice: once normally, once with collision debug visualisation enabled.
  3. No blocking collision, no invisible walls, no gaps at sidewalk/road seams.
  4. Fresh checkout builds against the documented external engine installation.
  5. Linux build packaged and launched; controls documented in Docs/ and shown in-game.
  6. Performance last. 60 FPS at 1440p per the performance check below — a floor every release meets, not the goal that shapes the content.
  7. Tag v0.1.0, write the CHANGELOG.md entry, then remove the completed section from TODO.md (its goal stays in ROADMAP.md).

Performance check (last)

Performance is the last check on purpose: realism leads the design and the frame budget only decides how much of it fits. It is still a floor — a release is not tagged below 60 FPS at 1440p without the owner's explicit approval.

Measured at 1440p on the development workstation: Bazzite, Ryzen 7 7700X, 64 GB RAM, RTX 5070 Ti 16 GB.

  • Record the quality preset, the exact upscaling state (off, DLSS/TSR/FXAA and mode), and the engine version.
  • Report frame rate without frame generation and with frame generation, separately.
  • Target: 60 FPS at 1440p without frame generation.
  • Capture a frame-time graph over a fixed traversal route, not a single sample. State the route.

Check-record template

Version Check Result Evidence Date
0.1.0 Traversal, both sides PASS — Blender pre-check + in-engine swept transect, 0 holes, ground Z 317..395 -qaselftest, TODO 0.1.0 notes 2026-11-08
0.1.0 Placement vs references PASS (with deliberate simplifications) Section below, 2026-11-08 2026-11-08
0.1.0 Collision and packaging PASS — no blocking collision, no invisible walls, no seam gaps (see audit note) -qaselftest on the packaged build, 2026-11-08 2026-11-08
0.1.0 60 FPS at 1440p PASS — 2.42 ms avg (414 fps), p99 3.01 ms at 2560×1440, TSR on, VSync off, no FG -qaselftest perf capture, Docs/perf/0.1.0-walk-frametimes.csv 2026-11-08
0.2.0 60 FPS at 1440p PASS — 2.64 ms avg (379 fps), p50 2.54, p95 3.39, p99 3.76, max 4.05 ms at 2560×1440, TSR on, VSync off, no FG -qaselftest perf capture, Docs/perf/0.2.0-walk-frametimes.csv 2026-11-09
0.2.0 Debug overlay cost PASS — same route with the F3 overlay drawn: 2.77 ms avg (361 fps), p50 2.64, p95 3.52, p99 3.87, max 4.43 ms; about 5 % heavier, still 6× the floor. The overlay is on for -perf/-qaselftest, off in the built demo Docs/perf/0.2.0-walk-frametimes-overlay.csv 2026-11-09
0.1.0 Fresh checkout build PASS — clean clone of main (4bc41e9), git lfs pull + check-lfs.sh OK (130 LFS files), both GigLineEditor and GigLine targets built with the documented engine /tmp/fresh-check, 2026-11-08 2026-11-08
0.1.0 Packaged Linux build PASS — packaged Development build launches straight into DemoMap, no missing-asset/linker errors; controls shown in-game and in Docs/controls.md measurement recorded 2026-11-08; the capture was removed from the repository 2026-11-09 2026-11-08

0.1.0 — Placement vs references — record (2026-11-08)

Checked against the reference photography (Art/reference/) and the Geo measurements (Geo/verification/*). Build under test: current main content, DemoMap rendered via Tools/render_screenshots.sh (2026-11-08, Vulkan SM5, 1920×1080); engine positions probed from the DemoMap (commandlet, 2026-11-08).

Placement and scale (in-engine ↔ reference)

Quantity In-engine (probed world-space) Reference Match
Road (Hollywood Blvd carriageway) Y −13.82..+10.47 m → 24.3 m crossing ways 20.9–25.9 m ✓ within range
South sidewalk strip 7.3 m (bbox incl. kerb apron); built walkable strip 4.0 m per Art/blender/README.md 12.6 m centreline offset; strip width from setback arithmetic ✓ offset 12.5 m ≈ ref 12.6 m
North sidewalk strip 8.6 m (bbox); built strip 5.3 m 13.6 m centreline offset ✓ offset 13.2 m ≈ ref 13.6 m
Kerbs 3.3 m apron face to 0.13 m upstand 0.15 m assumption; photo check pending (0.1.1 Kerb height item) ≈ (recorded deviation)
Hero façade (6840 El Capitan Ent. Ctr.) X −146.38..−120.34 m (26.0 m frontage), Y +13.0..+25.6 m from road centre (13.0 m deep) 6840 setback 14.5 m; 25.75 m frontage (resolved) ✓ frontage; setback ~1.5 m deeper than ref (recorded)
El Capitan Theatre (6838) X −120.82..−82.10 m, Y +13.4..+68.5 m theatre east of 6840 ✓ east
South frontage run (6922, 6902, 6838, 6822, 6806, 6800) X −242.76..−14.37 m, all Y +12..+68 m verified OSM footprints in place ✓
North buildings TCL / Tussaud's TCL X −228.9..−184.4, Y −94.3..−18.0; Tussaud's X −270.7..−228.0, Y −75.9..−18.9 north of the Blvd, west of hero (per OSM) ✓ placed north (−Y) across the road

Visual comparison (demo views vs references)

Shot Reference(s) used Verdict Notes
review-demo-spawn-view hollywood/el-capitan-facade-day-* (CC BY 2.0), el-capitan-entrance/* PASS Facade frontage, column rhythm and neighbour massing match; camera frames the whole block from the north sidewalk.
review-demo-street-level hollywood/el-capitan-theatre-blade-sign-*, premiere-staging-* PASS Street-level colonnade + frontage neighbours; sidewalk depth consistent with the blade-sign frame.
review-demo-crossing street-profile crossing s=130.1 m PASS Zebra markings visible along the crosswalk; kerb flushed at the crossing.
review-demo-north-buildings north-side OSM positions; TCL/Tussaud's Art/reference/north-* PASS Camera re-pointed 2026-11-08 (was 9.5 km west → 85% sky); buildings now framed. Flat blockout surfaces are the 0.1.4 scope.

Deliberate deviations recorded

  • North/south building surfaces are flat blockouts (bloblike, no façade detail). Detail texturing/façade style is the planned 0.1.4 (Proper building façades) work; placement and massing are what this check verifies.
  • Kerb upstand 0.13 m as built vs 0.15 m assumed; the DEM cannot resolve a kerb — tracked in 0.1.1 (Kerb height assumption).
  • Sidewalk surface detail (railings, pavers, domes) not modelled — outside 0.1.0 scope.
  • Crossing ramps are kerb flushes, not graded ramps — the 0.1.1 Crossing ramp gradient item.
  • Site identity (the neoclassical hero with motto band) matches the 2009 façade photograph and the 1922 Masonic elevation within blockout fidelity.

Pre-check method: Tools/judge_screenshot.py (vision model) flagged the simplified flat surfaces as "unexpected" — those flags are the deliberate deviations above, not placement errors. Final verdict is by human review of the shots in Screenshots/demo/.

0.1.0 — Collision and packaging — audit note (2026-11-08)

Run on the packaged build (GigLineQA, Development, Vulkan SM5) with -qaselftest.

  • Transect (holes/gaps): 1456 samples over 16 rows — lane centres plus the kerb/road/sidewalk seam Ys (−1382, −1053, +718, +1047 and neighbours) and X −20000..−2000. Result 0 holes. (The old 84-sample check covered only 3 lane centres; the seam rows are what this check adds.)
  • Invisible-wall probe: horizontal traces 30 m long, grounded at 160 cm above the local ground, along the road and both seam rows. Result 0/35 blocking hits inside 21 m — no invisible walls or misplaced blockers in the street envelope.
  • Facade occlusion probe: from the road centre, 40 m traces sideways at walking height toward each frontage, required only where the map stages a building (the spans are listed in AGigLineCharacter and mirror Tools/ue_build_demo_map.py). Result 0/9 directions without a blocking wall — the player cannot walk through the hero or the frontage. This probe found the hero façade had no simple collision at all (complex-only, so traces and capsule sweeps passed through it); it is now UseComplexAsSimple. Auto-generated convex hulls were tried first and rejected: on a 95-part, 26 m façade they bulged into the street (the wall probe went 0/35 → 2/35). (First pass used a fixed Z 160 start; the street is at Z ~366, so the probe started inside the earth and reported every row as a dist-0 blocker. Grounding the probe fixed that measurement bug.)
  • Walk / reset / pause: 761 cm in 2 s (Z steady 456), reset 0 cm, pause IsGamePaused()=1, unpause 0 — all PASS.
  • Packaging: the packaged build launches, reaches gameplay, and the QA run quits cleanly. The GigLineShotActor screenshot rounds are suppressed under -qaselftest so they cannot quit the run before the audit phases.
  • Caveat recorded: ground Z extremes (−12 m / 3000 cm) are trace-start/terrain-edge artifacts of the widened extent, not walkable holes — the walkable corridor is continuous (walk + transect both PASS).

0.1.0 — 60 FPS at 1440p — record (2026-11-08)

Build under test: packaged GigLineQA Development, UE 5.8.4, Vulkan SM5, NVIDIA 615.78.08 (RTX 5070 Ti), Bazzite, Ryzen 7 7700X, 64 GB RAM.

Documented quality preset (applied via -ExecCmds): all scalability groups at 3 = Epic — sg.ViewDistanceQuality 3, sg.ShadowQuality 3, sg.GlobalIlluminationQuality 3, sg.ReflectionQuality 3, sg.PostProcessQuality 3, sg.TextureQuality 3, sg.EffectsQuality 3, sg.FoliageQuality 3, sg.ShadingQuality 3.

Upscaling state (recorded from the run): r.AntiAliasingMethod=4 → TSR on, default screen percentage, r.VSync=0 (off), frame generation off/unavailable (r.Streamline.FrameGeneration.Mode absent → -999).

Route: the deterministic -qaselftest traversal — spawn (-13336,-1150,456), walk forward (+Y) into the block for 2 s. Frame times are captured every frame over that route (829 frames), not a single sample.

Result at 2560×1440:

Metric Value
Frames captured 829
Average 2.42 ms → 414 fps
p50 2.38 ms
p95 2.71 ms
p99 3.01 ms (≈332 fps)
Max 4.00 ms

Verdict: PASS — worst-case p99 is ~3 ms (≈330 fps), far above the 60 FPS target without frame generation.

Variance note: two back-to-back runs measured ~9.2 ms (≈108 fps) when another game instance / busy compositor overlapped the capture; repeated clean runs (windowed and fullscreen, Wayland and X11 drivers, window focused) all measured ~2.4–2.5 ms. The high outlier is recorded here rather than hidden.

Reproduce:

# from Game/…/Saved: the run writes Profiling/perf-walk-frametimes.csv
./GigLine.sh -fullscreen -ResX=2560 -ResY=1440 -nosplash -qaselftest \
  -ExecCmds="sg.ViewDistanceQuality 3,sg.ShadowQuality 3,sg.GlobalIlluminationQuality 3,sg.ReflectionQuality 3,sg.PostProcessQuality 3,sg.TextureQuality 3,sg.EffectsQuality 3,sg.FoliageQuality 3,sg.ShadingQuality 3"

Committed frame-time series: Docs/perf/0.1.0-walk-frametimes.csv.

0.1.5 re-measure with the façade kit in the map

Same route, same preset, packaged Development build, 2560×1440:

Metric 0.1.0 0.1.5 (kit + textures)
Average 2.42 ms (414 fps) 2.76 ms (363 fps)
p50 2.38 ms 2.73 ms
p95 2.71 ms 3.17 ms
p99 3.01 ms 3.64 ms
Max 4.00 ms 4.62 ms

The 625 kit actors and 8 generated textures cost about 12 % of frame time and still leave 363 fps average, p99 3.64 ms — roughly six times the 60 fps floor. Frame-time series: Docs/perf/0.1.5-kit-walk-frametimes.csv.

Measurement trap, again: runs that reported ~105 fps were two game instances overlapping (a previous launch had not exited). Confirm a single instance (pgrep -af Binaries/Linux/GigLine) before trusting a figure — 363 fps reproduced twice on a clean run.

0.1.0 — Fresh checkout build — record (2026-11-08)

Followed the documented steps in Docs/build.md exactly, into a clean directory with no prior state:

git clone https://git.allucanget.biz/zwitschi/gig-line.git /tmp/fresh-check
cd /tmp/fresh-check && git lfs install && git lfs pull
Tools/check-lfs.sh                      # -> "LFS check OK: 130 LFS-tracked file(s)"
cd /run/media/system/DATA/Engines/UE_5.8.4
Engine/Build/BatchFiles/Linux/Build.sh GigLineEditor Linux Development \
  -project=/tmp/fresh-check/Game/GigLine/GigLine.uproject -WaitMutex
Engine/Build/BatchFiles/Linux/Build.sh GigLine Linux Development \
  -project=/tmp/fresh-check/Game/GigLine/GigLine.uproject -WaitMutex
  • Clone of main at 4bc41e9; LFS objects fetched (DemoMap.umap is real UE package content, not a pointer).
  • GigLineEditor → Result: Succeeded (28.2 s); produced /tmp/fresh-check/Game/GigLine/Binaries/Linux/libUnrealEditor-GigLine.so.
  • GigLine (game) → Result: Succeeded (26.9 s).
  • Engine: documented external install at /run/media/system/DATA/Engines/UE_5.8.4 (UE 5.8.4), system clang; no machine-specific paths beyond the documented -project= argument.

Verdict: PASS.

0.1.0 — Packaged Linux build + documented controls — record (2026-11-08)

Package: RunUAT BuildCookRun … -platform=Linux -clientconfig=Development -cook -build -stage -pak -archive -archivedirectory=/run/media/system/DATA/Builds/GigLineQA → EXIT=0 (Success).

Launch: ./GigLine.sh -windowed (plain, no map argument) → LogLoad: LoadMap: /Game/Hollywood/DemoMap?Name=Player — the packaged game opens the walkable demo directly (the default-map fix holds in a package, not just the editor). No LogLinker/missing-asset/failed-to-find errors in the run.

Controls documented and shown in-game:

  • Docs/controls.md — full binding table (WASD, mouse look, Space, R, Esc) plus how to test input headlessly.
  • AGigLineHUD now draws a control legend bottom-right every frame: "WASD move · Mouse look · Space jump · R reset · Esc pause".
  • Measured in the packaged build on 2026-11-08: the bottom-right text bbox was 426×12 px (a single right-aligned line), attributed text bottom-left. The capture has since been removed from the repository, so the numbers stand as the record.

Verdict: PASS.