[Libreoffice-commits] online.git: Branch 'feature/latency' - 5 commits - loleaflet/src wsd/ClientSession.cpp wsd/DocumentBroker.cpp

Tamás Zolnai tamas.zolnai at collabora.com
Tue Jun 12 14:50:04 UTC 2018


 loleaflet/src/layer/tile/GridLayer.js |   79 +++++++++++++++-------------------
 loleaflet/src/layer/tile/TileLayer.js |   27 +----------
 wsd/ClientSession.cpp                 |    4 -
 wsd/DocumentBroker.cpp                |   23 +++++++++
 4 files changed, 64 insertions(+), 69 deletions(-)

New commits:
commit 6db06fc11b93bd25818a72ec49aa5e3cf61ea821
Author: Tamás Zolnai <tamas.zolnai at collabora.com>
Date:   Tue Jun 12 16:36:14 2018 +0200

    Send clientvisisblearea message immediately to the server by update
    
    Change-Id: Ia8522c4443a453f10a8c600dd9c124f4fd4bacb3

diff --git a/loleaflet/src/layer/tile/GridLayer.js b/loleaflet/src/layer/tile/GridLayer.js
index 2eec5ea9f..ec3a4dc6e 100644
--- a/loleaflet/src/layer/tile/GridLayer.js
+++ b/loleaflet/src/layer/tile/GridLayer.js
@@ -573,6 +573,7 @@ L.GridLayer = L.Layer.extend({
 			this._level.el.appendChild(fragment);
 		}
 		this._invalidateClientVisibleArea();
+		this._sendClientVisibleArea();
 	},
 
 	_updateOnChangePart: function () {
@@ -732,6 +733,20 @@ L.GridLayer = L.Layer.extend({
 		this._clientVisibleArea = true;
 	},
 
+	_sendClientVisibleArea: function () {
+		if (this._clientVisibleArea) {
+			// Visible area is dirty, update it on the server.
+			var visibleTopLeft = this._latLngToTwips(this._map.getBounds().getNorthWest());
+			var visibleBottomRight = this._latLngToTwips(this._map.getBounds().getSouthEast());
+			var visibleArea = new L.Bounds(visibleTopLeft, visibleBottomRight);
+			var size = new L.Point(visibleArea.getSize().x, visibleArea.getSize().y);
+			var payload = 'clientvisiblearea x=' + Math.round(visibleTopLeft.x) + ' y=' + Math.round(visibleTopLeft.y) +
+				' width=' + Math.round(size.x) + ' height=' + Math.round(size.y);
+			this._map._socket.sendMessage(payload);
+			this._clientVisibleArea = false;
+		}
+	},
+
 	_isValidTile: function (coords) {
 		if (coords.x < 0 || coords.y < 0) {
 			return false;
diff --git a/loleaflet/src/layer/tile/TileLayer.js b/loleaflet/src/layer/tile/TileLayer.js
index 906f1098a..1dcdf8df6 100644
--- a/loleaflet/src/layer/tile/TileLayer.js
+++ b/loleaflet/src/layer/tile/TileLayer.js
@@ -2265,21 +2265,6 @@ L.TileLayer = L.GridLayer.extend({
 			'tiletwipheight=' + this._tileHeightTwips;
 	},
 
-	_sendClientVisibleArea: function () {
-		if (this._clientVisibleArea) {
-			// Visible area is dirty, update it on the server.
-			var visibleTopLeft = this._latLngToTwips(this._map.getBounds().getNorthWest());
-			var visibleBottomRight = this._latLngToTwips(this._map.getBounds().getSouthEast());
-			var visibleArea = new L.Bounds(visibleTopLeft, visibleBottomRight);
-			var size = new L.Point(visibleArea.getSize().x, visibleArea.getSize().y);
-			var payload = 'clientvisiblearea x=' + Math.round(visibleTopLeft.x) + ' y=' + Math.round(visibleTopLeft.y) +
-				' width=' + Math.round(size.x) + ' height=' + Math.round(size.y);
-			this._map._socket.sendMessage(payload);
-			this._clientVisibleArea = false;
-		}
-	},
-
-
 	_debugGetTimeArray: function() {
 		return {count: 0, ms: 0, best: Number.MAX_SAFE_INTEGER, worst: 0, date: 0};
 	},
commit ca915290984e396f26f87a107bab1c15b4efc5fa
Author: Tamás Zolnai <tamas.zolnai at collabora.com>
Date:   Tue Jun 12 16:35:25 2018 +0200

    Always drop invalidate tile from cache
    
    Change-Id: I2a4bdbdd413759459cc2d77af90d8ab1ba83e6f7

diff --git a/wsd/ClientSession.cpp b/wsd/ClientSession.cpp
index ba2330540..4d1c5c0e5 100644
--- a/wsd/ClientSession.cpp
+++ b/wsd/ClientSession.cpp
@@ -1065,6 +1065,8 @@ void ClientSession::dumpState(std::ostream& os)
 void ClientSession::handleTileInvalidation(const std::string& message,
     const std::shared_ptr<DocumentBroker>& docBroker)
 {
+    docBroker->invalidateTiles(message);
+
     // Skip requesting new tiles if we don't have client visible area data yet.
     if(!_clientVisibleArea.hasSurface() ||
        _tileWidthPixel == 0 || _tileHeightPixel == 0 ||
@@ -1073,8 +1075,6 @@ void ClientSession::handleTileInvalidation(const std::string& message,
         return;
     }
 
-
-    docBroker->invalidateTiles(message);
     std::pair<int, Util::Rectangle> result = TileCache::parseInvalidateMsg(message);
     int part = result.first;
     Util::Rectangle& invalidateRect = result.second;
commit 30c33ed78d4a58a7512fab5cc70f4da285744fef
Author: Tamás Zolnai <tamas.zolnai at collabora.com>
Date:   Tue Jun 12 14:51:38 2018 +0200

    We might need to rerequest tile rendering when we are at sending them
    
    Change-Id: I0551e51c5f5023931dad13435b4ac3517fc48931

diff --git a/wsd/DocumentBroker.cpp b/wsd/DocumentBroker.cpp
index 3058a4ce6..6947eb7f3 100644
--- a/wsd/DocumentBroker.cpp
+++ b/wsd/DocumentBroker.cpp
@@ -1306,7 +1306,7 @@ void DocumentBroker::handleTileCombinedRequest(TileCombined& tileCombined,
         }
     }
 
-    // Send rendering request
+    // Send rendering request, prerender before we actually send the tiles
     if (!tilesNeedsRendering.empty())
     {
         std::cerr << "tilesNeedsRendering.size(): " << tilesNeedsRendering.size() << std::endl;
@@ -1376,6 +1376,7 @@ void DocumentBroker::sendRequestedTiles(const std::shared_ptr<ClientSession>& se
 
         // Satisfy as many tiles from the cache.
     std::cerr << "requestedTiles.size(): " << requestedTiles.get().getTiles().size() << std::endl;
+        std::vector<TileDesc> tilesNeedsRendering;
         for (auto& tile : requestedTiles.get().getTiles())
         {
         std::cerr << "alma: "<< std::endl;
@@ -1409,11 +1410,29 @@ void DocumentBroker::sendRequestedTiles(const std::shared_ptr<ClientSession>& se
             else
             {
         std::cerr << "not cachedTile: "<< std::endl;
-                // Not cached, needs rendering. Rendering request was already sent
+                // Not cached, needs rendering.
+                if(tile.getVersion() == -1) // Rendering of this tile was not requested yet
+                {
+                    tile.setVersion(++_tileVersion);
+                    tilesNeedsRendering.push_back(tile);
+                    _debugRenderedTileCount++;
+                }
                 tileCache().subscribeToTileRendering(tile, session);
         std::cerr << "not cachedTile2: "<< std::endl;
             }
         }
+
+        // Send rendering request for those tiles which were not prerendered
+        if (!tilesNeedsRendering.empty())
+        {
+            TileCombined newTileCombined = TileCombined::create(tilesNeedsRendering);
+
+            // Forward to child to render.
+            const std::string req = newTileCombined.serialize("tilecombine");
+            LOG_DBG("Some of the tiles were not prerendered. Sending residual tilecombine: " << req);
+            LOG_DBG("Sending residual tilecombine: " << req);
+            _childProcess->sendTextFrame(req);
+        }
         requestedTiles = boost::none;
     }
 }
commit 2d29be76ff13756f6c9c4beb02376f3a0d52f2ff
Author: Tamás Zolnai <tamas.zolnai at collabora.com>
Date:   Mon Jun 11 16:40:16 2018 +0200

    Code deduplication related to sending client visible area
    
    Change-Id: Iee9ea30041b7b086eefa373e403ce5b2f224fe7a

diff --git a/loleaflet/src/layer/tile/TileLayer.js b/loleaflet/src/layer/tile/TileLayer.js
index 6aec6514b..906f1098a 100644
--- a/loleaflet/src/layer/tile/TileLayer.js
+++ b/loleaflet/src/layer/tile/TileLayer.js
@@ -1477,17 +1477,7 @@ L.TileLayer = L.GridLayer.extend({
 			this._clientZoom = null;
 		}
 
-		if (this._clientVisibleArea) {
-			// Visible area is dirty, update it on the server.
-			var visibleTopLeft = this._latLngToTwips(this._map.getBounds().getNorthWest());
-			var visibleBottomRight = this._latLngToTwips(this._map.getBounds().getSouthEast());
-			var visibleArea = new L.Bounds(visibleTopLeft, visibleBottomRight);
-			var size = new L.Point(visibleArea.getSize().x, visibleArea.getSize().y);
-			var payload = 'clientvisiblearea x=' + Math.round(visibleTopLeft.x) + ' y=' + Math.round(visibleTopLeft.y) +
-				' width=' + Math.round(size.x) + ' height=' + Math.round(size.y);
-			this._map._socket.sendMessage(payload);
-			this._clientVisibleArea = false;
-		}
+		this._sendClientVisibleArea();
 
 		this._map._socket.sendMessage('mouse type=' + type +
 				' x=' + x + ' y=' + y + ' count=' + count +
@@ -1519,17 +1509,9 @@ L.TileLayer = L.GridLayer.extend({
 			this._map._socket.sendMessage('clientzoom ' + this._clientZoom);
 			this._clientZoom = null;
 		}
-		if (this._clientVisibleArea) {
-			// Visible area is dirty, update it on the server.
-			var visibleTopLeft = this._latLngToTwips(this._map.getBounds().getNorthWest());
-			var visibleBottomRight = this._latLngToTwips(this._map.getBounds().getSouthEast());
-			var visibleArea = new L.Bounds(visibleTopLeft, visibleBottomRight);
-			var size = new L.Point(visibleArea.getSize().x, visibleArea.getSize().y);
-			var payload = 'clientvisiblearea x=' + Math.round(visibleTopLeft.x) + ' y=' + Math.round(visibleTopLeft.y) +
-				' width=' + Math.round(size.x) + ' height=' + Math.round(size.y);
-			this._map._socket.sendMessage(payload);
-			this._clientVisibleArea = false;
-		}
+
+		this._sendClientVisibleArea();
+
 		this._map._socket.sendMessage('key type=' + type +
 				' char=' + charcode + ' key=' + keycode);
 	},
@@ -2283,6 +2265,20 @@ L.TileLayer = L.GridLayer.extend({
 			'tiletwipheight=' + this._tileHeightTwips;
 	},
 
+	_sendClientVisibleArea: function () {
+		if (this._clientVisibleArea) {
+			// Visible area is dirty, update it on the server.
+			var visibleTopLeft = this._latLngToTwips(this._map.getBounds().getNorthWest());
+			var visibleBottomRight = this._latLngToTwips(this._map.getBounds().getSouthEast());
+			var visibleArea = new L.Bounds(visibleTopLeft, visibleBottomRight);
+			var size = new L.Point(visibleArea.getSize().x, visibleArea.getSize().y);
+			var payload = 'clientvisiblearea x=' + Math.round(visibleTopLeft.x) + ' y=' + Math.round(visibleTopLeft.y) +
+				' width=' + Math.round(size.x) + ' height=' + Math.round(size.y);
+			this._map._socket.sendMessage(payload);
+			this._clientVisibleArea = false;
+		}
+	},
+
 
 	_debugGetTimeArray: function() {
 		return {count: 0, ms: 0, best: Number.MAX_SAFE_INTEGER, worst: 0, date: 0};
commit aa46b4a73d36a77111f763617b16cf8e6e67fb4c
Author: Tamás Zolnai <tamas.zolnai at collabora.com>
Date:   Mon Jun 11 16:26:09 2018 +0200

    Reduce code deduplication
    
    We can request tilecombine even if client needs actually one tile only.
    
    Change-Id: Id897f219885be4cb93635d727d4ee871a4b55cb7

diff --git a/loleaflet/src/layer/tile/GridLayer.js b/loleaflet/src/layer/tile/GridLayer.js
index c61c6bb05..2eec5ea9f 100644
--- a/loleaflet/src/layer/tile/GridLayer.js
+++ b/loleaflet/src/layer/tile/GridLayer.js
@@ -940,53 +940,33 @@ L.GridLayer = L.Layer.extend({
 		var twips, msg;
 		for (var r = 0; r < rectangles.length; ++r) {
 			rectQueue = rectangles[r];
-
-			if (rectQueue.length === 1) {
-				// only one tile here
-				coords = rectQueue[0];
-				key = this._tileCoordsToKey(coords);
-
+			var tilePositionsX = '';
+			var tilePositionsY = '';
+			for (i = 0; i < rectQueue.length; i++) {
+				coords = rectQueue[i];
 				twips = this._coordsToTwips(coords);
-				msg = 'tile ' +
-					'part=' + coords.part + ' ' +
-					'width=' + this._tileWidthPx + ' ' +
-					'height=' + this._tileHeightPx + ' ' +
-					'tileposx=' + twips.x + ' '	+
-					'tileposy=' + twips.y + ' ' +
-					'tilewidth=' + this._tileWidthTwips + ' ' +
-					'tileheight=' + this._tileHeightTwips;
-				this._map._socket.sendMessage(msg, key);
-			}
-			else {
-				// more tiles, use tilecombine
-				var tilePositionsX = '';
-				var tilePositionsY = '';
-				for (i = 0; i < rectQueue.length; i++) {
-					coords = rectQueue[i];
-					twips = this._coordsToTwips(coords);
-
-					if (tilePositionsX !== '') {
-						tilePositionsX += ',';
-					}
-					tilePositionsX += twips.x;
 
-					if (tilePositionsY !== '') {
-						tilePositionsY += ',';
-					}
-					tilePositionsY += twips.y;
+				if (tilePositionsX !== '') {
+					tilePositionsX += ',';
 				}
+				tilePositionsX += twips.x;
 
-				twips = this._coordsToTwips(coords);
-				msg = 'tilecombine ' +
-					'part=' + coords.part + ' ' +
-					'width=' + this._tileWidthPx + ' ' +
-					'height=' + this._tileHeightPx + ' ' +
-					'tileposx=' + tilePositionsX + ' '	+
-					'tileposy=' + tilePositionsY + ' ' +
-					'tilewidth=' + this._tileWidthTwips + ' ' +
-					'tileheight=' + this._tileHeightTwips;
-				this._map._socket.sendMessage(msg, '');
+				if (tilePositionsY !== '') {
+					tilePositionsY += ',';
+				}
+				tilePositionsY += twips.y;
 			}
+
+			twips = this._coordsToTwips(coords);
+			msg = 'tilecombine ' +
+				'part=' + coords.part + ' ' +
+				'width=' + this._tileWidthPx + ' ' +
+				'height=' + this._tileHeightPx + ' ' +
+				'tileposx=' + tilePositionsX + ' '	+
+				'tileposy=' + tilePositionsY + ' ' +
+				'tilewidth=' + this._tileWidthTwips + ' ' +
+				'tileheight=' + this._tileHeightTwips;
+			this._map._socket.sendMessage(msg, '');
 		}
 	},
 


More information about the Libreoffice-commits mailing list