From 7fabff5ffac497ea8a8245a22af446c66c19531f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Thu, 7 Mar 2013 10:41:23 +0100 Subject: [PATCH 1/2] Revert "Remove listeners when dropping tiles" This reverts commit fd6aaff2f5d7d1c9e448e345d6291d311822de53. --- src/ol/tile.js | 7 ------- src/ol/tilequeue.js | 9 --------- test/spec/ol/tilequeue.test.js | 27 ++++----------------------- 3 files changed, 4 insertions(+), 39 deletions(-) diff --git a/src/ol/tile.js b/src/ol/tile.js index 6b8956352b..9483ec0749 100644 --- a/src/ol/tile.js +++ b/src/ol/tile.js @@ -30,13 +30,6 @@ ol.Tile = function(tileCoord) { goog.base(this); - /** - * A count incremented each time the tile is inQueue in a tile queue, - * and decremented each time the tile is dequeued from a tile queue. - * @type {number} - */ - this.inQueue = 0; - /** * @type {ol.TileCoord} */ diff --git a/src/ol/tilequeue.js b/src/ol/tilequeue.js index 7e20822308..c5788df972 100644 --- a/src/ol/tilequeue.js +++ b/src/ol/tilequeue.js @@ -89,8 +89,6 @@ ol.TileQueue.prototype.dequeue_ = function() { } var tileKey = tile.getKey(); delete this.queuedTileKeys_[tileKey]; - tile.inQueue--; - goog.asserts.assert(tile.inQueue >= 0); return tile; }; @@ -112,8 +110,6 @@ ol.TileQueue.prototype.enqueue = function(tile, tileSourceKey, tileCenter) { this.heap_.push([priority, tile, tileSourceKey, tileCenter]); this.queuedTileKeys_[tileKey] = true; this.siftDown_(0, this.heap_.length - 1); - tile.inQueue++; - goog.asserts.assert(tile.inQueue > 0); } } }; @@ -250,11 +246,6 @@ ol.TileQueue.prototype.reprioritize = function() { if (priority == ol.TileQueue.DROP) { tileKey = tile.getKey(); delete this.queuedTileKeys_[tileKey]; - tile.inQueue--; - goog.asserts.assert(tile.inQueue >= 0); - if (tile.inQueue === 0) { - goog.events.removeAll(tile); - } } else { node[0] = priority; heap[n++] = node; diff --git a/test/spec/ol/tilequeue.test.js b/test/spec/ol/tilequeue.test.js index 57db2b2f8c..3ca38a2981 100644 --- a/test/spec/ol/tilequeue.test.js +++ b/test/spec/ol/tilequeue.test.js @@ -21,20 +21,13 @@ describe('ol.TileQueue', function() { } function addRandomPriorityTiles(tq, num) { - var tiles = []; var i, tile, priority; for (i = 0; i < num; i++) { tile = new ol.Tile(); - tile.toDrop = (i % 2 === 0) ? true : false; - goog.events.listen(tile, goog.events.EventType.CHANGE, - goog.nullFunction); priority = Math.floor(Math.random() * 100); tq.heap_.push([priority, tile, '', new ol.Coordinate(0, 0)]); tq.queuedTileKeys_[tile.getKey()] = true; - tile.inQueue++; - tiles.push(tile); } - return tiles; } describe('heapify', function() { @@ -52,15 +45,16 @@ describe('ol.TileQueue', function() { it('does reprioritize the array', function() { var tq = new ol.TileQueue(function() {}); - var tiles = addRandomPriorityTiles(tq, 100); + addRandomPriorityTiles(tq, 100); tq.heapify_(); // now reprioritize, changing the priority of 50 tiles and removing the // rest - tq.tilePriorityFunction_ = function(tile) { - if (tile.toDrop) { + var i = 0; + tq.tilePriorityFunction_ = function() { + if ((i++) % 2 === 0) { return ol.TileQueue.DROP; } return Math.floor(Math.random() * 100); @@ -70,23 +64,10 @@ describe('ol.TileQueue', function() { expect(tq.heap_.length).toEqual(50); expect(isHeap(tq)).toBeTruthy(); - var i, tile; - for (i = 0; i < tiles.length; ++i) { - tile = tiles[i]; - var hasListener = goog.events.hasListener(tile); - if (tile.toDrop) { - expect(hasListener).toBeFalsy(); - } else { - expect(hasListener).toBeTruthy(); - } - } - }); }); }); -goog.require('goog.events'); -goog.require('goog.events.EventType'); goog.require('ol.Coordinate'); goog.require('ol.Tile'); goog.require('ol.TileQueue'); From f55423d575e0dd4c6f80c5c34063e68c084db7e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Thu, 7 Mar 2013 11:03:20 +0100 Subject: [PATCH 2/2] Register change listeners for loading tiles only With this commit we register a change listener at a time when we are guaranteed that the listener will be called. In this was we don't need to remove listeners when the tile is dropped from the tile queue. And to avoid busy-polling between IDLE and LOADING we rely on the map to call requestRenderFrame when new tiles change to LOADING from IDLE. --- src/ol/map.js | 9 ++++++++- src/ol/renderer/canvas/canvastilelayerrenderer.js | 3 ++- src/ol/renderer/dom/domtilelayerrenderer.js | 3 ++- src/ol/renderer/webgl/webgltilelayerrenderer.js | 3 ++- src/ol/tilequeue.js | 3 ++- 5 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/ol/map.js b/src/ol/map.js index a687d54fb9..bffa9ab407 100644 --- a/src/ol/map.js +++ b/src/ol/map.js @@ -530,7 +530,14 @@ ol.Map.prototype.handleMapBrowserEvent = function(mapBrowserEvent) { */ ol.Map.prototype.handlePostRender = function() { this.tileQueue_.reprioritize(); // FIXME only call if needed - this.tileQueue_.loadMoreTiles(); + var moreLoadingTiles = this.tileQueue_.loadMoreTiles(); + if (moreLoadingTiles) { + // The tile layer renderers need to know when tiles change + // to the LOADING state (to register the change listener + // on the tile). + this.requestRenderFrame(); + } + var postRenderFunctions = this.postRenderFunctions_; var i; for (i = 0; i < postRenderFunctions.length; ++i) { diff --git a/src/ol/renderer/canvas/canvastilelayerrenderer.js b/src/ol/renderer/canvas/canvastilelayerrenderer.js index 216625d560..ee0983cb91 100644 --- a/src/ol/renderer/canvas/canvastilelayerrenderer.js +++ b/src/ol/renderer/canvas/canvastilelayerrenderer.js @@ -158,10 +158,11 @@ ol.renderer.canvas.TileLayer.prototype.renderFrame = tileState = tile.getState(); if (tileState == ol.TileState.IDLE) { - this.listenToTileChange(tile); this.updateWantedTiles(frameState.wantedTiles, tileSource, tileCoord); tileCenter = tileGrid.getTileCoordCenter(tileCoord); frameState.tileQueue.enqueue(tile, tileSourceKey, tileCenter); + } else if (tileState == ol.TileState.LOADING) { + this.listenToTileChange(tile); } else if (tileState == ol.TileState.LOADED) { tilesToDrawByZ[z][tileCoord.toString()] = tile; continue; diff --git a/src/ol/renderer/dom/domtilelayerrenderer.js b/src/ol/renderer/dom/domtilelayerrenderer.js index da2dd226a8..02c666b6a9 100644 --- a/src/ol/renderer/dom/domtilelayerrenderer.js +++ b/src/ol/renderer/dom/domtilelayerrenderer.js @@ -116,10 +116,11 @@ ol.renderer.dom.TileLayer.prototype.renderFrame = tileState = tile.getState(); if (tileState == ol.TileState.IDLE) { - this.listenToTileChange(tile); this.updateWantedTiles(frameState.wantedTiles, tileSource, tileCoord); tileCenter = tileGrid.getTileCoordCenter(tileCoord); frameState.tileQueue.enqueue(tile, tileSourceKey, tileCenter); + } else if (tileState == ol.TileState.LOADING) { + this.listenToTileChange(tile); } else if (tileState == ol.TileState.LOADED) { tilesToDrawByZ[z][tileCoord.toString()] = tile; continue; diff --git a/src/ol/renderer/webgl/webgltilelayerrenderer.js b/src/ol/renderer/webgl/webgltilelayerrenderer.js index 0058746bab..230a28c6d6 100644 --- a/src/ol/renderer/webgl/webgltilelayerrenderer.js +++ b/src/ol/renderer/webgl/webgltilelayerrenderer.js @@ -391,10 +391,11 @@ ol.renderer.webgl.TileLayer.prototype.renderFrame = tileState = tile.getState(); if (tileState == ol.TileState.IDLE) { - this.listenToTileChange(tile); this.updateWantedTiles(frameState.wantedTiles, tileSource, tileCoord); tileCenter = tileGrid.getTileCoordCenter(tileCoord); frameState.tileQueue.enqueue(tile, tileSourceKey, tileCenter); + } else if (tileState == ol.TileState.LOADING) { + this.listenToTileChange(tile); } else if (tileState == ol.TileState.LOADED) { if (mapRenderer.isTileTextureLoaded(tile)) { tilesToDrawByZ[z][tileCoord.toString()] = tile; diff --git a/src/ol/tilequeue.js b/src/ol/tilequeue.js index c5788df972..36316c39a2 100644 --- a/src/ol/tilequeue.js +++ b/src/ol/tilequeue.js @@ -168,7 +168,7 @@ ol.TileQueue.prototype.heapify_ = function() { /** - * FIXME empty description for jsdoc + * @return {boolean} New loading tiles? */ ol.TileQueue.prototype.loadMoreTiles = function() { var tile; @@ -179,6 +179,7 @@ ol.TileQueue.prototype.loadMoreTiles = function() { tile.load(); ++this.tilesLoading_; } + return goog.isDef(tile); };