From a14a15159fb93e6ad75df3abd9ad6748c67d50e1 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Mon, 8 Oct 2012 00:41:21 -0600 Subject: [PATCH] Simpler and more thorough tile pruning The render method always generates a map of all tiles that should be drawn (called tilesToDrawByZ). This includes tiles at alternate resolutions, tiles still loading, and tiles previously rendered. At the end of the render sequence we can simply remove all previously rendered tiles that aren't in tilesToDrawByZ. This provides an alternate solution to the problem described in #53 and more. --- src/ol/renderer/dom/tilelayer.js | 56 +++++--------------------------- 1 file changed, 9 insertions(+), 47 deletions(-) diff --git a/src/ol/renderer/dom/tilelayer.js b/src/ol/renderer/dom/tilelayer.js index 7fb1609950..d03d3eee2d 100644 --- a/src/ol/renderer/dom/tilelayer.js +++ b/src/ol/renderer/dom/tilelayer.js @@ -33,12 +33,6 @@ ol.renderer.dom.TileLayer = function(mapRenderer, tileLayer, target) { */ this.renderedMapResolution_ = undefined; - /** - * @type {ol.Extent} - * @private - */ - this.renderedExtent_ = null; - /** * @type {number|undefined} * @private @@ -85,35 +79,18 @@ ol.renderer.dom.TileLayer.prototype.getTileOffset_ = function(z, resolution) { /** - * Get rid of tiles that are not at the currently rendered z. + * Get rid of all tiles that weren't drawn in the most recent rendering. + * @param {Object.>} tilesDrawnByZ Tiles just + * rendered. * @private */ -ol.renderer.dom.TileLayer.prototype.removeAltZTiles_ = function() { - var z = this.renderedZ_; - var key, tileCoord, tile; +ol.renderer.dom.TileLayer.prototype.removeExtraTiles_ = + function(tilesDrawnByZ) { + var key, tileCoord, tilesDrawn, tile; for (key in this.renderedTiles_) { tileCoord = ol.TileCoord.createFromString(key); - if (tileCoord.z !== z) { - tile = this.renderedTiles_[key]; - delete this.renderedTiles_[key]; - goog.dom.removeNode(tile.getImage(this)); - } - } -}; - - -/** - * Get rid of tiles outside the rendered extent. - * @private - */ -ol.renderer.dom.TileLayer.prototype.removeOutOfRangeTiles_ = function() { - var mapExtent = this.renderedExtent_; - var grid = this.getLayer().getTileSource().getTileGrid(); - var key, tileCoord, tileExtent, tile; - for (key in this.renderedTiles_) { - tileCoord = ol.TileCoord.createFromString(key); - tileExtent = grid.getTileCoordExtent(tileCoord); - if (!tileExtent.intersects(mapExtent)) { + tilesDrawn = tilesDrawnByZ[tileCoord.z]; + if (!(tilesDrawn && key in tilesDrawn)) { tile = this.renderedTiles_[key]; delete this.renderedTiles_[key]; goog.dom.removeNode(tile.getImage(this)); @@ -133,15 +110,6 @@ ol.renderer.dom.TileLayer.prototype.handleTileChange_ = function(event) { if (tileCoord.z === this.renderedZ_) { var key = tileCoord.toString(); delete this.loadingTiles_[key]; - // determine if we've fully loaded this zoom level - var loaded = true; - for (key in this.loadingTiles_) { - loaded = false; - break; - } - if (loaded) { - this.removeAltZTiles_(); - } } }; @@ -195,7 +163,6 @@ ol.renderer.dom.TileLayer.prototype.render = function() { // first pass through the tile range to determine all the tiles needed - var allTilesLoaded = true; tileRange.forEachTileCoord(z, function(tileCoord) { var tile = tileSource.getTile(tileCoord); if (goog.isNull(tile)) { @@ -214,7 +181,6 @@ ol.renderer.dom.TileLayer.prototype.render = function() { this.loadingTiles_[key] = tile; tile.load(); } - allTilesLoaded = false; // TODO: only append after load? tilesToDrawByZ[z][key] = tile; } @@ -302,12 +268,8 @@ ol.renderer.dom.TileLayer.prototype.render = function() { goog.dom.appendChild(this.target, fragment); } - this.renderedExtent_ = mapExtent; this.renderedZ_ = z; this.renderedMapResolution_ = mapResolution; - if (allTilesLoaded) { - this.removeAltZTiles_(); - } - this.removeOutOfRangeTiles_(); + this.removeExtraTiles_(tilesToDrawByZ); };