From 7be73d7385421685cf6db71f6401551d583da325 Mon Sep 17 00:00:00 2001 From: Pierre Ossman Date: Mon, 6 Nov 2017 13:16:35 +0100 Subject: [PATCH] Avoid corner case of applications rendering at frame rate There is a problematic corner case where an application is updating at exactly the same rate that we're sending update. In that case we may miss updates regularly, getting a very uneven final frame rate. Avoid this by introducing a slight offset when we start updating. --- common/rfb/VNCServerST.cxx | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/common/rfb/VNCServerST.cxx b/common/rfb/VNCServerST.cxx index 46c4be9b..f27099f0 100644 --- a/common/rfb/VNCServerST.cxx +++ b/common/rfb/VNCServerST.cxx @@ -529,6 +529,13 @@ bool VNCServerST::handleTimeout(Timer* t) return false; writeUpdate(); + + // If this is the first iteration then we need to adjust the timeout + if (frameTimer.getTimeoutMs() != 1000/rfb::Server::frameRate) { + frameTimer.start(1000/rfb::Server::frameRate); + return false; + } + return true; } @@ -573,7 +580,10 @@ void VNCServerST::startFrameClock() if (blockCounter > 0) return; - frameTimer.start(1000/rfb::Server::frameRate); + // The first iteration will be just half a frame as we get a very + // unstable update rate if we happen to be perfectly in sync with + // the application's update rate + frameTimer.start(1000/rfb::Server::frameRate/2); } void VNCServerST::stopFrameClock() -- 2.39.5