From fb99d81cccc469b0457c877cd726ffb15c3179b6 Mon Sep 17 00:00:00 2001 From: Joel Martin Date: Wed, 14 Apr 2010 12:03:01 -0500 Subject: [PATCH] Better hextile performance: index subrects instead of slicing/shifting. - Many times better performance. Before this, browser was spending all it's time garbage collecting or doing something. Now the bottleneck is in set fillStyle and fillRect which is probably where it should be. --- vnc.js | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/vnc.js b/vnc.js index 14a0ee1e..72b70922 100644 --- a/vnc.js +++ b/vnc.js @@ -227,7 +227,7 @@ init_msg: function () { display_raw: function () { console.log(">> display_raw"); Canvas.rfbImage(FBU.x, FBU.y, FBU.width, FBU.height, RFB.d); - RFB.d.splice(0, FBU.width * FBU.height * RFB.fb_Bpp); + RFB.d.shiftBytes(FBU.width * FBU.height * RFB.fb_Bpp); FBU.rects --; }, @@ -331,6 +331,7 @@ display_hextile: function() { if (subencoding > -1) { /* We know the encoding and have a whole tile */ FBU.subencoding = RFB.d.shift8(); + FBU.bytes--; if (FBU.subencoding == 0) { if (FBU.lastsubencoding & 0x01) { /* Weird: ignore blanks after RAW */ @@ -343,37 +344,45 @@ display_hextile: function() { } } else if (FBU.subencoding & 0x01) { // Raw Canvas.rfbImage(x, y, w, h, RFB.d); - RFB.d.splice(0, FBU.bytes - 1); } else { + var idx = 0; if (FBU.subencoding & 0x02) { // Background - FBU.background = RFB.d.shiftBytes(RFB.fb_Bpp); + FBU.background = RFB.d.slice(idx, idx + RFB.fb_Bpp); + idx += RFB.fb_Bpp; //console.log(" background: " + FBU.background); } if (FBU.subencoding & 0x04) { // Foreground - FBU.foreground = RFB.d.shiftBytes(RFB.fb_Bpp); + FBU.foreground = RFB.d.slice(idx, idx + RFB.fb_Bpp); + idx += RFB.fb_Bpp; //console.log(" foreground: " + FBU.foreground); } Canvas.rfbRect(x, y, w, h, FBU.background); if (FBU.subencoding & 0x08) { // AnySubrects - subrects = RFB.d.shift8(); + subrects = RFB.d[idx]; + idx++; + var color, xy, sx, sy, wh, sw, sh; for (var i = 0; i < subrects; i ++) { if (FBU.subencoding & 0x10) { // SubrectsColoured - var color = RFB.d.shiftBytes(RFB.fb_Bpp); + color = RFB.d.slice(idx, idx + RFB.fb_Bpp); + idx += RFB.fb_Bpp; } else { - var color = FBU.foreground; + color = FBU.foreground; } - var xy = RFB.d.shift8(); - var sx = x + (xy >> 4); - var sy = y + (xy & 0x0f); + xy = RFB.d[idx]; + idx++; + sx = x + (xy >> 4); + sy = y + (xy & 0x0f); - var wh = RFB.d.shift8(); - var sw = (wh >> 4) + 1; - var sh = (wh & 0x0f) + 1; + wh = RFB.d[idx]; + idx++; + sw = (wh >> 4) + 1; + sh = (wh & 0x0f) + 1; Canvas.rfbRect(sx, sy, sw, sh, color); } } } + if (FBU.bytes > 0) RFB.d.shiftBytes(FBU.bytes); FBU.lastsubencoding = FBU.subencoding; FBU.subencoding = -1; FBU.tiles --;