Repeat the last frame on every refresh the game has no new frame for

SteamVR on the Steam Frame ran the game at half the 120 Hz display rate,
since render-first pacing submits only when a game frame is sealed, and
filled every other refresh itself even with Motion Smoothing off, which
doubled the HUD and the menu screen while the head turned. With the new
[vr] repeat_frames (default on for the Frame, off elsewhere, live), the
pacing thread waits a millisecond for the eyes and otherwise spends the
refresh on a keep-alive cycle that resubmits the retained layer with its
rendered poses, paced by xrWaitFrame.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019HBRGKTE1GnN2ah8gcZKr3
This commit is contained in:
Claude committed 2026-10-04 16:16:37 +00:00
1 parent 60fdb4b447
commit 8718d1ddd2
6 files changed
+77 -5

No files matched your search

+5
View File
@@ -41,6 +41,7 @@ mirror_view = "normal"
controller_mode = "wii_remote"
frame_interpolation_fps = 0
refresh_rate = 0
repeat_frames = false
render_scale = 1.0
world_units_per_meter = 500.0
hud_distance_meters = 2.0
@@ -231,6 +232,10 @@ Frame) to leave the headset's own. The game renders 60 frames a second, so 120 H
for exactly two refreshes. A rate the runtime does not list, or declines, is logged and leaves its
own; setting `0` again restores the rate the session started at. It is live from F10 / the headset
panel (*Headset refresh rate*) and the Quest launcher; runtimes without the extension ignore it.
`repeat_frames` (default off, on for the Steam Frame) submits the last frame again, with the poses it
was rendered for, on each refresh the game has no new frame for, so a runtime sees the app at the
display's rate and does not halve it and fill refreshes itself (SteamVR on the Frame did, doubling the
HUD while the head turned). Render-first pacing only; live from F10 / the headset panel.
## Controllers