From 2bd29ff60e1223a84cec0d10a2cdd0f2b3bc2ceb Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Wed, 6 Feb 2013 16:08:24 -0700 Subject: [PATCH] Only track tiles that are actually wanted Instead of keeping track of wanted tile ranges, we can instead track wanted tiles individually. This provides enough for the map to know how to prioritize tiles and should be more efficient (no extra calls to extend tile ranges or check for tile containment within a range). --- src/ol/framestate.js | 2 +- src/ol/map.js | 5 ++--- .../canvas/canvastilelayerrenderer.js | 2 +- src/ol/renderer/dom/domtilelayerrenderer.js | 2 +- src/ol/renderer/layerrenderer.js | 21 +++++++------------ .../renderer/webgl/webgltilelayerrenderer.js | 2 +- 6 files changed, 13 insertions(+), 21 deletions(-) diff --git a/src/ol/framestate.js b/src/ol/framestate.js index bbe89d10a0..9e45ce99b6 100644 --- a/src/ol/framestate.js +++ b/src/ol/framestate.js @@ -31,7 +31,7 @@ goog.require('ol.layer.LayerState'); * usedTiles: Object.>, * view2DState: ol.View2DState, * viewHints: Array., - * wantedTiles: Object.>}} + * wantedTiles: Object.>}} */ ol.FrameState; diff --git a/src/ol/map.js b/src/ol/map.js index 50e9347ff8..d134cae46c 100644 --- a/src/ol/map.js +++ b/src/ol/map.js @@ -500,9 +500,8 @@ ol.Map.prototype.getTilePriority = function(tile, tileSourceKey, tileCenter) { if (goog.isNull(frameState) || !(tileSourceKey in frameState.wantedTiles)) { return ol.TileQueue.DROP; } - var zKey = tile.tileCoord.z.toString(); - if (!(zKey in frameState.wantedTiles[tileSourceKey]) || - !frameState.wantedTiles[tileSourceKey][zKey].contains(tile.tileCoord)) { + var coordKey = tile.tileCoord.toString(); + if (!frameState.wantedTiles[tileSourceKey][coordKey]) { return ol.TileQueue.DROP; } var center = frameState.view2DState.center; diff --git a/src/ol/renderer/canvas/canvastilelayerrenderer.js b/src/ol/renderer/canvas/canvastilelayerrenderer.js index 59b0c6051c..c2987af91b 100644 --- a/src/ol/renderer/canvas/canvastilelayerrenderer.js +++ b/src/ol/renderer/canvas/canvastilelayerrenderer.js @@ -167,6 +167,7 @@ ol.renderer.canvas.TileLayer.prototype.renderFrame = tileState = tile.getState(); if (tileState == ol.TileState.IDLE) { + this.updateWantedTiles(frameState.wantedTiles, tileSource, tileCoord); tileCenter = tileGrid.getTileCoordCenter(tileCoord); frameState.tileQueue.enqueue(tile, tileSourceKey, tileCenter); } else if (tileState == ol.TileState.LOADED) { @@ -216,7 +217,6 @@ ol.renderer.canvas.TileLayer.prototype.renderFrame = if (!allTilesLoaded) { frameState.animate = true; - this.updateWantedTiles(frameState.wantedTiles, tileSource, z, tileRange); } this.updateUsedTiles(frameState.usedTiles, tileSource, z, tileRange); diff --git a/src/ol/renderer/dom/domtilelayerrenderer.js b/src/ol/renderer/dom/domtilelayerrenderer.js index a92d34a0d2..0676d629d6 100644 --- a/src/ol/renderer/dom/domtilelayerrenderer.js +++ b/src/ol/renderer/dom/domtilelayerrenderer.js @@ -131,6 +131,7 @@ ol.renderer.dom.TileLayer.prototype.renderFrame = tileState = tile.getState(); if (tileState == ol.TileState.IDLE) { + this.updateWantedTiles(frameState.wantedTiles, tileSource, tileCoord); tileCenter = tileGrid.getTileCoordCenter(tileCoord); frameState.tileQueue.enqueue(tile, tileSourceKey, tileCenter); } else if (tileState == ol.TileState.LOADED) { @@ -234,7 +235,6 @@ ol.renderer.dom.TileLayer.prototype.renderFrame = if (!allTilesLoaded) { frameState.animate = true; - this.updateWantedTiles(frameState.wantedTiles, tileSource, z, tileRange); } this.updateUsedTiles(frameState.usedTiles, tileSource, z, tileRange); diff --git a/src/ol/renderer/layerrenderer.js b/src/ol/renderer/layerrenderer.js index 4ff6f66cab..982a454d72 100644 --- a/src/ol/renderer/layerrenderer.js +++ b/src/ol/renderer/layerrenderer.js @@ -4,6 +4,7 @@ goog.require('goog.events'); goog.require('goog.events.EventType'); goog.require('ol.FrameState'); goog.require('ol.Object'); +goog.require('ol.TileCoord'); goog.require('ol.TileRange'); goog.require('ol.layer.Layer'); goog.require('ol.layer.LayerProperty'); @@ -197,24 +198,16 @@ ol.renderer.Layer.prototype.updateUsedTiles = /** * @protected - * @param {Object.>} wantedTiles Wanted - * tile ranges. + * @param {Object.>} wantedTiles Wanted tiles. * @param {ol.source.Source} source Source. - * @param {number} z Z. - * @param {ol.TileRange} tileRange Tile range. + * @param {ol.TileCoord} tileCoord Tile coordinate. */ ol.renderer.Layer.prototype.updateWantedTiles = - function(wantedTiles, source, z, tileRange) { + function(wantedTiles, source, tileCoord) { var sourceKey = goog.getUid(source).toString(); - var zKey = z.toString(); - if (sourceKey in wantedTiles) { - if (zKey in wantedTiles[sourceKey]) { - wantedTiles[sourceKey][zKey].extend(tileRange); - } else { - wantedTiles[sourceKey][zKey] = tileRange; - } - } else { + var coordKey = tileCoord.toString(); + if (!(sourceKey in wantedTiles)) { wantedTiles[sourceKey] = {}; - wantedTiles[sourceKey][zKey] = tileRange; } + wantedTiles[sourceKey][coordKey] = true; }; diff --git a/src/ol/renderer/webgl/webgltilelayerrenderer.js b/src/ol/renderer/webgl/webgltilelayerrenderer.js index 3663948de8..77cf37aa79 100644 --- a/src/ol/renderer/webgl/webgltilelayerrenderer.js +++ b/src/ol/renderer/webgl/webgltilelayerrenderer.js @@ -393,6 +393,7 @@ ol.renderer.webgl.TileLayer.prototype.renderFrame = tileState = tile.getState(); if (tileState == ol.TileState.IDLE) { + this.updateWantedTiles(frameState.wantedTiles, tileSource, tileCoord); tileCenter = tileGrid.getTileCoordCenter(tileCoord); frameState.tileQueue.enqueue(tile, tileSourceKey, tileCenter); } else if (tileState == ol.TileState.LOADED) { @@ -457,7 +458,6 @@ ol.renderer.webgl.TileLayer.prototype.renderFrame = this.renderedTileRange_ = null; this.renderedFramebufferExtent_ = null; frameState.animate = true; - this.updateWantedTiles(frameState.wantedTiles, tileSource, z, tileRange); } }