[BUG]~50ms (6 frames @120fps) display latency regression vs v1.10.0, even with Frame Mixer = None #807
Labels
No labels
bug
documentation
duplicate
enhancement
good first issue
help wanted
invalid
question
stale
wontfix
No milestone
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
gh-streetpea/chiaki-ng#807
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Current
mainshows roughly 6 frames (@120fps) ≈ 50ms more displaylatency than the v1.10.0 release, on the same machine, network and game.
Bisection points to the frame pacing / presentation rework that landed in
April 2026 (starting around
45237ac9). The regression persists withFrame Mixer = None (the default), so the cost comes from the scheduling
framework itself, not from frame mixing.
Environment
main(a875aa08) vs official v1.10.0 buildMeasurement method
A 120fps phone camera records the PS5's directly-connected monitor and
the Chiaki client window side by side in the same shot. Latency is counted as
the number of 120fps frames between an action appearing on the PS5's direct
display and the same action appearing in Chiaki. The direct display serves as
a shared zero-reference for both builds, so the delta between builds is
measurement-error independent.
0c4a45df): 7 frames @120fps (~58ms) behind the direct displaymain(a875aa08, default settings, Frame Mixer = None): 13 frames @120fps(~108ms) behind the direct display
Restoring only
gui/src/qmlmainwindow.cpp/qmlmainwindow.hto theirv1.10.0 state on top of
mainbrings latency back to 7 frames,confirming the regression is fully contained in the presentation-layer rework
in those files (+5348 lines across ~34 commits).
Root cause analysis
v1.10.0 renders arrival-driven: decoded frame →
pl_queue→ presented at thenext Qt frame. The rework changed this to scheduled presentation:
45237ac9— frame timing now follows the screen clock instead of thehost stream, so frames wait for their scheduled vsync slot
ec3cbecb/54de4deb— queue depth tolerance increased;pl_queuenowsteadily holds ~2 frames
e6614c67/c2cc3ce0— deferred swap thread / thread-based presentationadds another pipeline stage
instrumented median holding time is ~42ms on this machine, the same order
of magnitude as the measured regression
This trade-off makes sense for video playback (smoothness, judder-free frame
mixing, A/V sync), but for game streaming the frame is the input feedback —
every scheduled slot is direct input-to-photon latency.
Frame Mixer is NOT the cause
Frame Mixer defaults to
None, and the full 13-frame latency is reproduciblein that state. The mixing feature is idle, but the pacing machinery built for
it (staging queue, screen-clock scheduling, deferred swap) stays on the hot
path unconditionally.
Notably, May saw a revert chain around this code (
2c5d9160→70cbd238→6b1ecefa) plus follow-up fixes for its side effects (FIFO swapchainc650d297,render gating off
03bba538, swapchain depth 1bf132abc, stuck-screen fix),suggesting the new scheduling has been fragile. Possibly related: #743.
Suggested fix
When Frame Mixer = None, the pacing framework isn't needed — presentation
could fall back to arrival-driven rendering (v1.10.0 behavior) in that
configuration, or behind a "low latency mode" toggle. Happy to test patches
on this setup.
can you try the direct frame video option in this build: https://github.com/streetpea/chiaki-ng/actions/runs/34158163343/artifacts/10031923419 @onlyou2030