diff --git a/src/ol/PluggableMap.js b/src/ol/PluggableMap.js index 97ecd273ec..f8ceb3310d 100644 --- a/src/ol/PluggableMap.js +++ b/src/ol/PluggableMap.js @@ -47,7 +47,7 @@ import {create as createTransform, apply as applyTransform} from './transform.js * @property {import("./size.js").Size} size * @property {!Object} skippedFeatureUids * @property {TileQueue} tileQueue - * @property {Object>} usedTiles + * @property {!Object>} usedTiles * @property {Array} viewHints * @property {!Object>} wantedTiles */ diff --git a/src/ol/TileCache.js b/src/ol/TileCache.js index 54b0cb4fd6..701e48e076 100644 --- a/src/ol/TileCache.js +++ b/src/ol/TileCache.js @@ -21,8 +21,7 @@ class TileCache extends LRUCache { expireCache(usedTiles) { while (this.canExpireCache()) { const tile = this.peekLast(); - const zKey = tile.tileCoord[0].toString(); - if (zKey in usedTiles && usedTiles[zKey].contains(tile.tileCoord)) { + if (tile.getKey() in usedTiles) { break; } else { this.pop().dispose(); diff --git a/src/ol/VectorRenderTile.js b/src/ol/VectorRenderTile.js index 025e76c418..bc0c7ed4c7 100644 --- a/src/ol/VectorRenderTile.js +++ b/src/ol/VectorRenderTile.js @@ -103,6 +103,10 @@ class VectorRenderTile extends Tile { */ disposeInternal() { this.removeSourceTiles_(this); + for (const key in this.context_) { + const canvas = this.context_[key].canvas; + canvas.width = canvas.height = 0; + } this.setState(TileState.ABORT); super.disposeInternal(); } diff --git a/src/ol/render/canvas.js b/src/ol/render/canvas.js index bf6e314614..09a3c7696e 100644 --- a/src/ol/render/canvas.js +++ b/src/ol/render/canvas.js @@ -169,6 +169,17 @@ export const defaultLineWidth = 1; export const labelCache = new LRUCache(); +/** + * Prune the label cache. + */ +export function pruneLabelCache() { + while (labelCache.canExpireCache()) { + const canvas = labelCache.pop(); + canvas.width = canvas.height = 0; + } +} + + /** * @type {!Object} */ diff --git a/src/ol/render/canvas/TextBuilder.js b/src/ol/render/canvas/TextBuilder.js index e5850def1e..d77b62edf1 100644 --- a/src/ol/render/canvas/TextBuilder.js +++ b/src/ol/render/canvas/TextBuilder.js @@ -6,7 +6,7 @@ import {asColorLike} from '../../colorlike.js'; import {intersects} from '../../extent.js'; import {matchingChunk} from '../../geom/flat/straightchunk.js'; import GeometryType from '../../geom/GeometryType.js'; -import {labelCache, defaultTextAlign, defaultPadding, defaultLineCap, defaultLineDashOffset, defaultLineDash, defaultLineJoin, defaultFillStyle, checkFont, defaultFont, defaultLineWidth, defaultMiterLimit, defaultStrokeStyle, defaultTextBaseline} from '../canvas.js'; +import {pruneLabelCache, defaultTextAlign, defaultPadding, defaultLineCap, defaultLineDashOffset, defaultLineDash, defaultLineJoin, defaultFillStyle, checkFont, defaultFont, defaultLineWidth, defaultMiterLimit, defaultStrokeStyle, defaultTextBaseline} from '../canvas.js'; import CanvasInstruction from './Instruction.js'; import CanvasBuilder from './Builder.js'; import TextPlacement from '../../style/TextPlacement.js'; @@ -131,7 +131,7 @@ class CanvasTextBuilder extends CanvasBuilder { */ this.strokeKey_ = ''; - labelCache.prune(); + pruneLabelCache(); } /** diff --git a/src/ol/renderer/Layer.js b/src/ol/renderer/Layer.js index 3dd5682626..4d2249a180 100644 --- a/src/ol/renderer/Layer.js +++ b/src/ol/renderer/Layer.js @@ -192,26 +192,18 @@ class LayerRenderer extends Observable { } /** - * @param {!Object>} usedTiles Used tiles. + * @param {!Object>} usedTiles Used tiles. * @param {import("../source/Tile.js").default} tileSource Tile source. - * @param {number} z Z. - * @param {import("../TileRange.js").default} tileRange Tile range. + * @param {import('../Tile.js').default} tile Tile. * @protected */ - updateUsedTiles(usedTiles, tileSource, z, tileRange) { + updateUsedTiles(usedTiles, tileSource, tile) { // FIXME should we use tilesToDrawByZ instead? const tileSourceKey = getUid(tileSource); - const zKey = z.toString(); - if (tileSourceKey in usedTiles) { - if (zKey in usedTiles[tileSourceKey]) { - usedTiles[tileSourceKey][zKey].extend(tileRange); - } else { - usedTiles[tileSourceKey][zKey] = tileRange; - } - } else { + if (!(tileSourceKey in usedTiles)) { usedTiles[tileSourceKey] = {}; - usedTiles[tileSourceKey][zKey] = tileRange; } + usedTiles[tileSourceKey][tile.getKey()] = true; } /** diff --git a/src/ol/renderer/canvas/TileLayer.js b/src/ol/renderer/canvas/TileLayer.js index 104ae39ad1..42c51e60e6 100644 --- a/src/ol/renderer/canvas/TileLayer.js +++ b/src/ol/renderer/canvas/TileLayer.js @@ -283,6 +283,7 @@ class CanvasTileLayerRenderer extends CanvasLayerRenderer { this.drawTileImage(tile, frameState, layerState, x, y, w, h, tileGutter, z === currentZ); this.renderedTiles.push(tile); + this.updateUsedTiles(frameState.usedTiles, tileSource, tile); } } @@ -291,7 +292,6 @@ class CanvasTileLayerRenderer extends CanvasLayerRenderer { this.renderedResolution = tileResolution; this.renderedExtent_ = canvasExtent; - this.updateUsedTiles(frameState.usedTiles, tileSource, z, tileRange); this.manageTilePyramid(frameState, tileSource, tileGrid, pixelRatio, projection, extent, z, tileLayer.getPreload()); this.scheduleExpireCache(frameState, tileSource); diff --git a/src/ol/source/BingMaps.js b/src/ol/source/BingMaps.js index 02f5b59783..7db6aa1fff 100644 --- a/src/ol/source/BingMaps.js +++ b/src/ol/source/BingMaps.js @@ -50,7 +50,7 @@ const TOS_ATTRIBUTION = '