diff --git a/src/xpra/server/window_source.py b/src/xpra/server/window_source.py index e25d325629..27d067a09d 100644 --- a/src/xpra/server/window_source.py +++ b/src/xpra/server/window_source.py @@ -28,6 +28,8 @@ DELTA = os.environ.get("XPRA_DELTA", "1")=="1" MIN_DELTA_SIZE = int(os.environ.get("XPRA_MIN_DELTA_SIZE", "1024")) MAX_DELTA_SIZE = int(os.environ.get("XPRA_MAX_DELTA_SIZE", "32768")) +MAX_DELTA_HITS = int(os.environ.get("XPRA_MAX_DELTA_HITS", "20")) + HAS_ALPHA = os.environ.get("XPRA_ALPHA", "1")=="1" FORCE_BATCH = os.environ.get("XPRA_FORCE_BATCH", "0")=="1" STRICT_MODE = os.environ.get("XPRA_ENCODING_STRICT_MODE", "0")=="1" @@ -299,8 +301,8 @@ def up(prefix, d): now = time.time() for i,x in enumerate(self.delta_pixel_data): if x: - w, h, coding, store, buflen, _, last_used = x - info["encoding.delta.bucket[%s]" % i] = w, h, coding, store, buflen, int((now-last_used)*1000) + w, h, coding, store, buflen, _, hits, last_used = x + info["encoding.delta.bucket[%s]" % i] = w, h, coding, store, buflen, hits, int((now-last_used)*1000) up("encoding", self.get_quality_speed_info()) try: #ie: get_strict_encoding -> "strict_encoding" @@ -1470,7 +1472,7 @@ def make_data_packet(self, damage_time, process_damage_time, wid, image, coding, log("make_data_packet: image=%s, damage data: %s", image, (wid, x, y, w, h, coding)) start = time.time() mmap_data = None - delta, store, bucket = -1, -1, -1 + delta, store, bucket, hits = -1, -1, -1, 0 if self._mmap and self._mmap_size>0 and psize>256: mmap_data = mmap_send(self._mmap, self._mmap_size, image, self.rgb_formats, self.supports_transparency) if mmap_data: @@ -1496,15 +1498,22 @@ def make_data_packet(self, damage_time, process_damage_time, wid, image, coding, for i, dr in enumerate(list(self.delta_pixel_data)): if dr is None: continue - lw, lh, lcoding, lsequence, buflen, ldata, _ = dr + lw, lh, lcoding, lsequence, buflen, ldata, hits, _ = dr if lw==w and lh==h and lcoding==coding and buflen==dlen: + deltalog("delta: using matching bucket %s: %sx%s (%s, %i bytes, sequence=%i, hit count=%s)", i, lw, lh, lcoding, dlen, lsequence, hits) #xor with this matching delta bucket: delta = lsequence bucket = i xored = xor_str(dpixels, ldata) image.set_pixels(xored) dr[-1] = time.time() #update last used time - deltalog("delta: using matching bucket %s: %sx%s (%s, %i bytes, sequence=%i)", i, lw, lh, lcoding, dlen, lsequence) + if MAX_DELTA_HITS>0 and hits