docs(tested): the recorder thread in the Market on a 6-core Linux desktop, interleaved off and on #369

Merged
HumanBean merged 1 commit from GrimVisage/Longshot:docs/tested-market-recorder-thread into main 2026-11-14 05:29:27 +00:00
Contributor

Why

Whether the recorder thread (RX_VK_RECORDER=thread) helps in the Market, where the frame is CPU-bound, had not been timed (it was flat in Kokiri and the Field, which were GPU-bound). On a 6-core Linux desktop it does: +6.5% fps and a quarter off the replay, standing in the Market. These are the four runs, recorded as docs/tested-configurations.md asks.

What changed

  • docs: four files under docs/tested/, 2026-11-13-market-recorder-grimvisage-run01.md to run04.md, one run each, in the format of docs/tested/README.md: one build (main 5a8ae7e3) with the recorder off and with RX_VK_RECORDER=thread, interleaved off, thread, thread, off; Ryzen 5 5600X and RX 9070 XT on Fedora 45 (RADV 26.2.6), the Market standing for 120 s, uncapped. The frozen table is untouched and no assembled view is committed.

What the runs found (medians of two runs an arm, from the files):

main @ 5a8ae7e3, recorder off main @ 5a8ae7e3, RX_VK_RECORDER=thread Δ
fps, average 41.9 / 41.7 44.5 / 44.6 +6.5%
fps, 1% low 32.7 / 32.1 33.0 / 33.7 +2.9%
frame time, median 23.78 / 23.79 ms 22.33 / 22.28 ms -1.48 ms
frame time, p99 28.99 / 29.40 ms 28.91 / 28.25 ms -0.62 ms
replay submit a frame 18.64 / 18.75 ms 13.73 / 13.91 ms -4.88 ms (-26%)
GPU time a frame 12.7 / 12.8 ms 12.1 / 12.1 ms -0.65 ms
[hos host] vk: RX_VK_RECORDER=thread: vkCmd* packed on the replay thread and run in order by a recorder thread; the replay waits for it at each command buffer begin, end and reset, submit, wait, readback, destruction and replay lock release (serial replay only ...
[hos host] vk: recorder: 412013 packets run in 10.0 s (busy 0.18 s, spun idle 1.70 s, slept 6915 times, 2020 of them under 200 us), 0 calls made directly (no room); the replay waited for it 33687 times, 54.79 ms in all, the longest 2.33 ms; ...

Baseline: main @ 5a8ae7e3, recorder off. A switch on one build, so the comparison is the switch off against on, not main against a change.

Flags and settings

None.

Measurements

A docs change: measured by its check (CONTRIBUTING.md, "Measurements": docs, test output on main and with this PR).

main: cf605c85 (the branch's base)
this PR: docs/tested-market-recorder-thread @ 6e2794d0
Hardware: Ryzen 5 5600X, 31 GB, Fedora 45 (kernel 7.3.3), Python 3.15.2
Scene: none (game-free checks)
Method: python -I -B tests/test_tested_configurations.py, and python -I -B tests/run_all.py on this PR with the failing checks run again on main
How to reproduce: the two commands above from the repository root

main @ cf605c85 this PR @ 6e2794d0
tests/test_tested_configurations.py passes (without these files) 25 tests OK, with the four files
tests/run_all.py test_menu_keys, test_module_ids, test_pad_layout fail 480 passed, 3 failed (the same three), 76 skipped
$ python -I -B tests/test_tested_configurations.py
Ran 25 tests in 0.029s
OK

$ python -I -B tests/run_all.py
480 passed, 3 failed, 76 skipped in 88 s (linux, 12 at once)
(failed: tests/test_menu_keys.py, tests/test_module_ids.py, tests/test_pad_layout.py; each also fails alone on main cf605c85)

The runs' method: one build, interleaved runs through the control bridge (longshot_ctl.py launch --save --slot --env RX_VK_RECORDER=thread), A until in play, the Market loaded and no event, 10 s, then 120 s with no input, frame times from HOS_PRESENT_TRACE between two status frames.

Testing

Tested: the files' format check (tests/test_tested_configurations.py) and the whole game-free suite on Linux (Fedora 45); the three failures there also fail on main cf605c85 on this PC. The runs were made in the game on this PC (Ryzen 5 5600X, RX 9070 XT, RADV 26.2.6), and then a played session with RX_VK_RECORDER=thread in the Market: nothing drawn wrong, no device lost, no errors in the log.

Not tested: the website's catalogue built from these files (it reads docs/tested/ directly; not run here); the recorder elsewhere than the Market on this PC.

Needs other testers: None

Screenshots

Nothing on screen.

Risk and rollback

Docs only: nothing the game, the builds or the checks run changes. Reverting the commit removes the files.

Reviewer notes

Each file repeats the run's context in full, as docs/tested/README.md asks; the rows differ in their run number, time, arm and numbers. A separate topic from #364 (the #231 and #232 runs), so a separate PR.

Issues

See #162

Checklist

For everyone

  • One topic.
  • The title is a Conventional Commit (type(scope): description).
  • Rebased on current main.
  • python -I -B tests/run_all.py run and passing (any failure that also fails on main is named above).
  • Tested in the game, or what wasn't is named under Testing.
  • Testing filled in: what was tested, what wasn't, and what needs other testers (with test requests).
  • Measured: main and this PR at named commits, on the same PC, scene and settings, at least 2 interleaved runs each, the median reported.
  • No game files, dumps, build output or generated files.
  • third_party/ untouched (a new folder with a PROVENANCE.md instead).
  • The license is OK: GPL-3.0-or-later, nothing incompatible and nothing decompiled.

If applicable

  • AI assistance recorded with Assisted-by: / Co-Authored-By: trailers.
  • A file in docs/tested/ for each new measured run (format in docs/tested-configurations.md; no appended row or assembled view).
  • Docs updated.

🤖 Generated with Claude Code

## Why Whether the recorder thread (`RX_VK_RECORDER=thread`) helps in the Market, where the frame is CPU-bound, had not been timed (it was flat in Kokiri and the Field, which were GPU-bound). On a 6-core Linux desktop it does: +6.5% fps and a quarter off the replay, standing in the Market. These are the four runs, recorded as `docs/tested-configurations.md` asks. ## What changed - docs: four files under `docs/tested/`, `2026-11-13-market-recorder-grimvisage-run01.md` to `run04.md`, one run each, in the format of `docs/tested/README.md`: one build (main 5a8ae7e3) with the recorder off and with `RX_VK_RECORDER=thread`, interleaved off, thread, thread, off; Ryzen 5 5600X and RX 9070 XT on Fedora 45 (RADV 26.2.6), the Market standing for 120 s, uncapped. The frozen table is untouched and no assembled view is committed. What the runs found (medians of two runs an arm, from the files): | | main @ 5a8ae7e3, recorder off | main @ 5a8ae7e3, `RX_VK_RECORDER=thread` | Δ | |---|---|---|---| | fps, average | 41.9 / 41.7 | 44.5 / 44.6 | +6.5% | | fps, 1% low | 32.7 / 32.1 | 33.0 / 33.7 | +2.9% | | frame time, median | 23.78 / 23.79 ms | 22.33 / 22.28 ms | -1.48 ms | | frame time, p99 | 28.99 / 29.40 ms | 28.91 / 28.25 ms | -0.62 ms | | replay submit a frame | 18.64 / 18.75 ms | 13.73 / 13.91 ms | -4.88 ms (-26%) | | GPU time a frame | 12.7 / 12.8 ms | 12.1 / 12.1 ms | -0.65 ms | ``` [hos host] vk: RX_VK_RECORDER=thread: vkCmd* packed on the replay thread and run in order by a recorder thread; the replay waits for it at each command buffer begin, end and reset, submit, wait, readback, destruction and replay lock release (serial replay only ... [hos host] vk: recorder: 412013 packets run in 10.0 s (busy 0.18 s, spun idle 1.70 s, slept 6915 times, 2020 of them under 200 us), 0 calls made directly (no room); the replay waited for it 33687 times, 54.79 ms in all, the longest 2.33 ms; ... ``` Baseline: main @ 5a8ae7e3, recorder off. A switch on one build, so the comparison is the switch off against on, not main against a change. ## Flags and settings None. ## Measurements A docs change: measured by its check (CONTRIBUTING.md, "Measurements": `docs`, test output on main and with this PR). main: cf605c85 (the branch's base) this PR: docs/tested-market-recorder-thread @ 6e2794d0 Hardware: Ryzen 5 5600X, 31 GB, Fedora 45 (kernel 7.3.3), Python 3.15.2 Scene: none (game-free checks) Method: `python -I -B tests/test_tested_configurations.py`, and `python -I -B tests/run_all.py` on this PR with the failing checks run again on main How to reproduce: the two commands above from the repository root | | main @ cf605c85 | this PR @ 6e2794d0 | |---|---|---| | `tests/test_tested_configurations.py` | passes (without these files) | 25 tests OK, with the four files | | `tests/run_all.py` | `test_menu_keys`, `test_module_ids`, `test_pad_layout` fail | 480 passed, 3 failed (the same three), 76 skipped | ``` $ python -I -B tests/test_tested_configurations.py Ran 25 tests in 0.029s OK $ python -I -B tests/run_all.py 480 passed, 3 failed, 76 skipped in 88 s (linux, 12 at once) (failed: tests/test_menu_keys.py, tests/test_module_ids.py, tests/test_pad_layout.py; each also fails alone on main cf605c85) ``` The runs' method: one build, interleaved runs through the control bridge (`longshot_ctl.py launch --save --slot --env RX_VK_RECORDER=thread`), A until in play, the Market loaded and no event, 10 s, then 120 s with no input, frame times from `HOS_PRESENT_TRACE` between two `status` frames. ## Testing **Tested:** the files' format check (`tests/test_tested_configurations.py`) and the whole game-free suite on Linux (Fedora 45); the three failures there also fail on main cf605c85 on this PC. The runs were made in the game on this PC (Ryzen 5 5600X, RX 9070 XT, RADV 26.2.6), and then a played session with `RX_VK_RECORDER=thread` in the Market: nothing drawn wrong, no device lost, no errors in the log. **Not tested:** the website's catalogue built from these files (it reads `docs/tested/` directly; not run here); the recorder elsewhere than the Market on this PC. **Needs other testers:** None ## Screenshots Nothing on screen. ## Risk and rollback Docs only: nothing the game, the builds or the checks run changes. Reverting the commit removes the files. ## Reviewer notes Each file repeats the run's context in full, as `docs/tested/README.md` asks; the rows differ in their run number, time, arm and numbers. A separate topic from #364 (the #231 and #232 runs), so a separate PR. ## Issues See https://git.magicbean.dev/MagicBeanDev/Longshot/pulls/162 ## Checklist ### For everyone - [x] One topic. - [x] The title is a Conventional Commit (`type(scope): description`). - [x] Rebased on current `main`. - [x] `python -I -B tests/run_all.py` run and passing (any failure that also fails on `main` is named above). - [x] Tested in the game, or what wasn't is named under Testing. - [x] Testing filled in: what was tested, what wasn't, and what needs other testers (with test requests). - [x] Measured: main and this PR at named commits, on the same PC, scene and settings, at least 2 interleaved runs each, the median reported. - [x] No game files, dumps, build output or generated files. - [x] `third_party/` untouched (a new folder with a `PROVENANCE.md` instead). - [x] The license is OK: GPL-3.0-or-later, nothing incompatible and nothing decompiled. ### If applicable - [x] AI assistance recorded with `Assisted-by:` / `Co-Authored-By:` trailers. - [x] A file in `docs/tested/` for each new measured run (format in `docs/tested-configurations.md`; no appended row or assembled view). - [x] Docs updated. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
docs(tested): the recorder thread in the Market on a 6-core Linux desktop, interleaved off and on
Some checks are pending
CI / Conventional Commit title (pull_request) Blocked by required conditions
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Blocked by required conditions
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Blocked by required conditions
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Blocked by required conditions
CI / Workflow lint (actionlint) (pull_request) Blocked by required conditions
Third-party parts / As their notes say (pull_request) Blocked by required conditions
Third-party parts / The same as upstream (pull_request) Blocked by required conditions
Website / Website on Cloudflare (pull_request) Blocked by required conditions
PR description / Description follows the template (pull_request_target) Successful in 5s
6e2794d0a9
Four measured runs on a Ryzen 5 5600X and RX 9070 XT (Fedora 45, RADV 26.2.6), one build (main 5a8ae7e3) with the
recorder off and with RX_VK_RECORDER=thread, interleaved off, thread, thread, off, standing in the Market for 120 s,
uncapped, through the control bridge: 41.8 against 44.55 fps (medians), the replay 18.7 against 13.8 ms a frame.
One file a run under docs/tested/.

Assisted-by: Claude Opus 5.5
Co-Authored-By: Claude Opus 5.5 <[email protected]>
GrimVisage changed title from WIP: docs(tested): the recorder thread in the Market on a 6-core Linux desktop, interleaved off and on to docs(tested): the recorder thread in the Market on a 6-core Linux desktop, interleaved off and on 2026-11-14 05:15:02 +00:00
HumanBean deleted branch docs/tested-market-recorder-thread 2026-11-14 05:29:28 +00:00
Some checks are pending
CI / Conventional Commit title (pull_request) Blocked by required conditions
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Blocked by required conditions
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Blocked by required conditions
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Blocked by required conditions
CI / Workflow lint (actionlint) (pull_request) Blocked by required conditions
Third-party parts / As their notes say (pull_request) Blocked by required conditions
Third-party parts / The same as upstream (pull_request) Blocked by required conditions
Website / Website on Cloudflare (pull_request) Blocked by required conditions
PR description / Description follows the template (pull_request_target) Successful in 5s
Some workflows are waiting to be reviewed.
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
MagicBeanDev/Longshot!369
No description provided.