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.
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;
}
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()