Repository navigation
Test OBS capture: one-click check and "highest steady FPS" search for this PC (#646) - #1067
Conversation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…pture test (#646) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…x); fps_max comparison hook; name registered since #555 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… still pictures Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…other demo…", clearer repeat wording Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Regenerated studio/src/console_commands_data.js (both sides' ds_ names). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…bot demo (#646) Bundles the first 100 s of m00cat's ktps4-thunder-anzio-axis.dem (test-fixtures/dodstudio_benchmark_anzio.dem, cut with trim_demo, 6.5 MB) in place of ci_fixture.dem, and records 1:32-2:30, its two busy stretches. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…maps load the encoder more (#646) The bundled window is 58 s, so a test records about a minute, not 20 s: the tooltips' times follow, and the 1-minute option only lengthens a clip of the user's own demo. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…the bundled demo (#646) The bundled anzio stretch is lighter to encode than detailed maps (200 fps at High on an RTX 3070 Ti, where a dod_harrington match fails at 165), so Find my highest steady FPS recommends one ladder step lower and Use N fps uses that. On the player's own demo the busiest stretch is already the worst case: no margin. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Merged dev in, and a live test on POST at OBS Quality Max: passesMerge (a7ab92a): #1066 is on dev now, so this PR's diff is its own. Two conflicts:
fmt, clippy (1.98.1), Live (POST-Anniversary, Brain under Test OBS capture, 120 fps, bundled demo: "Sustainable. 0% skipped, 0% missed, 0.25% of the moving frames repeated. The game itself: 240 fps average, 1% low 236 fps, 0.1% low 199 fps. Sound: present, -0.8 dB. Nothing to change." No end toasts, Last Batch untouched, the take deleted after. Find my highest steady FPS, Max (7 min 30 s, stopped at the first clear failure):
Result: "Steady up to 165 fps at OBS Quality Max on this demo. Recommended: 144 fps (one step lower, for busier maps)." plus the Why-lower line. OBS Capture FPS went back to 120 after the ladder; Use 144 fps set it to 144 and saved it. Max tops out lower than High (200 in the PR's run), as expected from its I444 path. Small thing seen: for about a second the step line read "Reading the clip: frame 0 of 0" before the frame count arrived. |
… no "frame 0 of 0" while the clip's length is read Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Release note: New: "Test OBS capture" and "Find my highest steady FPS" beside the OBS settings record a test clip of a real match and say whether your PC keeps up at your OBS Capture FPS and OBS Quality, and which setting to change.
Closes #646
Carries #1066's commits (
fix/obs-encoder-speed-1060): the test is meaningless on the old encoder settings. Once #1066 merges, this PR's diff shrinks to its own changes.What the panel does
test-fixtures/dodstudio_benchmark_anzio.dem, see below) as a normal one-clip OBS batch at the current settings. On one of your own demos it records 20 s (60 s with "1-minute clips") around the highlight with the most kills. Then it judges three things and says Sustainable / Borderline / Not sustainable with one setting to change:GetStats, own connection, 250 ms): frames skipped (encoder lag) and missed (rendering lag).signalstatsYDIF < 0.15 on a 640-wide copy ([R&D] OBS mode: what hasn't been verified live yet #645's method).volumedetect).ds_debug_record_frame_timescvar, switched on and off around the clip by two scheduled commands; average, 1% and 0.1% low, and how many frames took longer than one OBS frame.obs_test_session id: their takes come back asobs_test_takes_verified, so they never mark highlights captured, never replace Last Batch and never start Finish clips; the end toasts and OS notifications are skipped.The bundled demo
test-fixtures/dodstudio_benchmark_anzio.dem, 6.5 MB: the first 100 s ofktps4-thunder-anzio-axis.dem, recorded by the repo owner, m00cat ("ChillRx (m00cat)"), a 6v6 KTPS4 vs Thunder match ondod_anzio, no lost packets. Player names in it are public (CLAUDE.md).cargo run --release -p analysis --example trim_demo -- ktps4-thunder-anzio-axis.dem 100 dodstudio_benchmark_anzio.dem, which reproduces the tested file byte for byte (SHA-256d57e6667def0a38fd0bb81311c54ee57aeed363784c4e045e0fcf7f746dea453). Only the end can be cut (one full entity snapshot, at the start).ci_fixture.dem's 1 and 3.8, and 15-21% slower for the game to draw (timedemo, PRE and POST).BUNDLED_WINDOW= 92-150 s (viewdemo clock): 1:32-1:52 has 11 grenades and 6 kills, 2:10-2:30 6 grenades and 6 kills; m00cat's own kills at 1:46 and 1:57 anchor the clip.studio/src-tauri/tauri.conf.json(obs-test/dodstudio_benchmark_anzio.dem, +6.5 MB to the install)..gitignoregets the matching!/test-fixtures/...exception.ci_fixture.demstays a test fixture but is no longer bundled.desktop-studio'sthe_test_demo_is_found_from_the_repositoryand newthe_bundled_window_gives_a_clip(the demo's highlights fill the window);hl-demo-auditor's newthe_benchmark_demo_passes_the_integrity_check(and its folder test now expects both fixtures).Thresholds
Steady: at most 0.5% skipped or missed and 1% repeated (clean runs measured 0-0.4% and 0.07-0.37%, #645/#1060). Not steady: 5% or more, the live warning's share (lagging runs measured 32-98%).
Overlap with #1063
Both read
GetStats. This PR addsObsClient::stats/record_activenearobs_versionand keeps its own smallBenchCountersinobs/bench.rs, so neither depends on the other;obs/mod.rsgets onepub modline each (adjacent lines: a trivial conflict for whichever merges second). Once both are in,bench.rscould use #1063'sFrameCountersinstead.Test done
After the safety margin (JS only): JS unit 933 pass (new:
recommendedRatestep / edge / own demo, the summary lines); Playwright full suite 413 pass (the ladder recommends 120 when 144 held, "Use 165 fps" when 180 held and the table keeps all 6 rates, own demo recommends 165 when 165 held), incl.app-boot.Local, after the demo swap:
cargo test --workspace --lockedall pass; clippy 1.98.1 workspace (--all-targets -D warnings), fmt; JS unit 931 pass; Playwright full suite 412 pass (incl.app-bootandobs-capture-test.spec.js). Earlier: nativeobs::55, goldsrc-hooksframe_times3 (i686), clippy goldsrc-hooks i686.Live, POST, Brain via game_lock, OBS 33.0.0, 2560x1440, RTX 3070 Ti, my own Studio build with its own settings copy (user's settings.json unchanged), game behind other windows:
wsod25_grp5_h1_m00cat(dod_harrington), 165 Highci_fixture.demci_fixture.demwsod25_grp5_h1_m00cat(real match), HighThe anzio demo does not bring the result down to a harrington match's: on this PC it holds 200 fps at High like the bot demo did, where the WSOD25 harrington stretch fails at 165. OBS's encoder load follows what's on screen, and harrington's detail costs it more than anzio's fights. The panel's note now says a map with more detail loads the encoder more and to test one of your own demos for other maps.
fps_max (#1058's 2x rule), old bundled demo, High, repeated / game 1% low:
2x holds: it matches uncapped within noise and beats rate and +10%; above ~120 it is uncapped in practice (the game draws 230-480 fps). No change to the rule.
The repeat count was changed after the first live clips: a plain "YDIF under 0.15" counted 23% of frames at 120 fps with the game at 240 fps, all in still stretches of 8-157 frames (the player standing still). It now counts only runs of up to 100 ms between moving frames: 0 such frames at fps_max 240, 34 (1.9% of moving frames) at fps_max 120, which matches #645's 1.5-2.1% against HLAE takes.
Decisions
ci_fixture.demas the bundled resource.recommendedRateinobs_capture_test_logic.js.recommendedRate.)commands.rs, the name inCommands.txtandconsole_commands_data.js.For review
ladderBest,ladderBestEdge,ladderBestOwn,LADDER_MARGIN_WHYinstrings.js) and the margin on the bundled demo only.DEMO_NOTE, the two button tooltips,LONG_TITLE).🤖 Generated with Claude Code