]> source.dussan.org Git - tigervnc.git/commitdiff
Avoid corner case of applications rendering at frame rate
authorPierre Ossman <ossman@cendio.se>
Mon, 6 Nov 2017 12:16:35 +0000 (13:16 +0100)
committerPierre Ossman <ossman@cendio.se>
Mon, 6 Nov 2017 12:20:08 +0000 (13:20 +0100)
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

index 46c4be9b0f4e66cc2cb3720370eb3d1cee8393e2..f27099f0b9d1a62b05af2ce897721bec7e9c580f 100644 (file)
@@ -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()