Avoid refresh of recently changed areas
If an area recently changed then we can guess that it will most likely
change again very soon. In such a case it is meaningless to send a
lossless refresh as it will directly be overwritten. Keep track of
such areas and avoid refreshing them until we no longer see any
changes to them.
diff --git a/common/rfb/EncodeManager.h b/common/rfb/EncodeManager.h
index a91c544..bdae906 100644
--- a/common/rfb/EncodeManager.h
+++ b/common/rfb/EncodeManager.h
@@ -25,6 +25,7 @@
#include <rdr/types.h>
#include <rfb/PixelBuffer.h>
#include <rfb/Region.h>
+#include <rfb/Timer.h>
namespace rfb {
class SConnection;
@@ -36,7 +37,7 @@
struct RectInfo;
- class EncodeManager {
+ class EncodeManager : public Timer::Callback {
public:
EncodeManager(SConnection* conn);
~EncodeManager();
@@ -47,6 +48,8 @@
static bool supported(int encoding);
bool needsLosslessRefresh(const Region& req);
+ int getNextLosslessRefresh(const Region& req);
+
void pruneLosslessRefresh(const Region& limits);
void writeUpdate(const UpdateInfo& ui, const PixelBuffer* pb,
@@ -57,6 +60,8 @@
size_t maxUpdateSize);
protected:
+ virtual bool handleTimeout(Timer* t);
+
void doUpdate(bool allowLossy, const Region& changed,
const Region& copied, const Point& copy_delta,
const PixelBuffer* pb,
@@ -117,6 +122,10 @@
std::vector<int> activeEncoders;
Region lossyRegion;
+ Region recentlyChangedRegion;
+ Region pendingRefreshRegion;
+
+ Timer recentChangeTimer;
struct EncoderStats {
unsigned rects;