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] 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); };