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 46c4be9..f27099f 100644
--- a/common/rfb/VNCServerST.cxx
+++ b/common/rfb/VNCServerST.cxx
@@ -529,6 +529,13 @@
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 @@
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()