From: Pierre Ossman Date: Mon, 6 Nov 2017 12:16:35 +0000 (+0100) Subject: Avoid corner case of applications rendering at frame rate X-Git-Tag: v1.8.90~84 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=7be73d7385421685cf6db71f6401551d583da325;p=tigervnc.git 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. --- 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()