From da6eed850ccddfefa8be0c3571b83368b7c3d955 Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Sun, 5 Jan 2020 11:24:46 +0100 Subject: [PATCH] Do not lock label cache entries --- src/ol/VectorRenderTile.js | 6 --- src/ol/render/canvas/Executor.js | 13 +---- src/ol/render/canvas/ExecutorGroup.js | 22 +------- src/ol/render/canvas/LabelCache.js | 53 +------------------ src/ol/render/canvas/TextBuilder.js | 3 +- src/ol/renderer/canvas/VectorLayer.js | 3 -- src/ol/renderer/canvas/VectorTileLayer.js | 6 --- test/spec/ol/render/canvas/labelcache.test.js | 18 +------ 8 files changed, 7 insertions(+), 117 deletions(-) diff --git a/src/ol/VectorRenderTile.js b/src/ol/VectorRenderTile.js index a22a38991a..1bff7afcc3 100644 --- a/src/ol/VectorRenderTile.js +++ b/src/ol/VectorRenderTile.js @@ -127,12 +127,6 @@ class VectorRenderTile extends Tile { canvas.width = 0; canvas.height = 0; } - for (const key in this.executorGroups) { - const executorGroups = this.executorGroups[key]; - for (let i = 0, ii = executorGroups.length; i < ii; ++i) { - executorGroups[i].disposeInternal(); - } - } super.disposeInternal(); } diff --git a/src/ol/render/canvas/Executor.js b/src/ol/render/canvas/Executor.js index ebe8946f57..5ec354c5b0 100644 --- a/src/ol/render/canvas/Executor.js +++ b/src/ol/render/canvas/Executor.js @@ -18,7 +18,6 @@ import { } from '../../transform.js'; import {createCanvasContext2D} from '../../dom.js'; import {labelCache, defaultTextAlign, measureTextHeight, measureAndCacheTextWidth, measureTextWidths} from '../canvas.js'; -import Disposable from '../../Disposable.js'; import RBush from 'rbush/rbush.js'; @@ -52,7 +51,7 @@ const p3 = []; const p4 = []; -class Executor extends Disposable { +class Executor { /** * @param {number} resolution Resolution. * @param {number} pixelRatio Pixel ratio. @@ -60,7 +59,6 @@ class Executor extends Disposable { * @param {SerializableInstructions} instructions The serializable instructions */ constructor(resolution, pixelRatio, overlaps, instructions) { - super(); /** * @protected @@ -156,15 +154,6 @@ class Executor extends Disposable { this.widths_ = {}; } - /** - * @inheritDoc - */ - disposeInternal() { - labelCache.release(this); - super.disposeInternal(); - } - - /** * @param {string} text Text. * @param {string} textKey Text style key. diff --git a/src/ol/render/canvas/ExecutorGroup.js b/src/ol/render/canvas/ExecutorGroup.js index 852179f346..871456ba62 100644 --- a/src/ol/render/canvas/ExecutorGroup.js +++ b/src/ol/render/canvas/ExecutorGroup.js @@ -10,7 +10,6 @@ import {isEmpty} from '../../obj.js'; import BuilderType from './BuilderType.js'; import {create as createTransform, compose as composeTransform} from '../../transform.js'; import Executor from './Executor.js'; -import Disposable from '../../Disposable.js'; /** * @const @@ -26,7 +25,7 @@ const ORDER = [ ]; -class ExecutorGroup extends Disposable { +class ExecutorGroup { /** * @param {import("../../extent.js").Extent} maxExtent Max extent for clipping. When a * `maxExtent` was set on the Buillder for this executor group, the same `maxExtent` @@ -40,7 +39,6 @@ class ExecutorGroup extends Disposable { * @param {number=} opt_renderBuffer Optional rendering buffer. */ constructor(maxExtent, resolution, pixelRatio, overlaps, allInstructions, opt_renderBuffer) { - super(); /** * @private @@ -128,24 +126,6 @@ class ExecutorGroup extends Disposable { } } - /** - * @inheritDoc - */ - disposeInternal() { - for (const z in this.executorsByZIndex_) { - const executors = this.executorsByZIndex_[z]; - for (const key in executors) { - executors[key].disposeInternal(); - } - } - if (this.hitDetectionContext_) { - const canvas = this.hitDetectionContext_.canvas; - canvas.width = 0; - canvas.height = 0; - } - - super.disposeInternal(); - } /** * @param {Array} executors Executors. diff --git a/src/ol/render/canvas/LabelCache.js b/src/ol/render/canvas/LabelCache.js index dfa800428e..37de689738 100644 --- a/src/ol/render/canvas/LabelCache.js +++ b/src/ol/render/canvas/LabelCache.js @@ -1,4 +1,3 @@ -import {getUid} from '../../util.js'; import LRUCache from '../../structs/LRUCache.js'; /** @@ -11,59 +10,11 @@ import LRUCache from '../../structs/LRUCache.js'; */ class LabelCache extends LRUCache { - /** - * @inheritDoc - */ - constructor(opt_highWaterMark) { - super(opt_highWaterMark); - this.consumers = {}; - } - - clear() { - this.consumers = {}; - super.clear(); - } - - /** - * @override - * @param {string} key Label key. - * @param {import("./Executor.js").default} consumer Label consumer. - * @return {HTMLCanvasElement} Label. - */ - get(key, consumer) { - const canvas = super.get(key); - const consumerId = getUid(consumer); - if (!(consumerId in this.consumers)) { - this.consumers[consumerId] = {}; - } - this.consumers[consumerId][key] = true; - return canvas; - } - - prune() { - outer: + expireCache() { while (this.canExpireCache()) { - const key = this.peekLastKey(); - for (const consumerId in this.consumers) { - if (key in this.consumers[consumerId]) { - break outer; - } - } - const canvas = this.pop(); - canvas.width = 0; - canvas.height = 0; - for (const consumerId in this.consumers) { - delete this.consumers[consumerId][key]; - } + this.pop(); } } - - /** - * @param {import("./Executor.js").default} consumer Label consumer. - */ - release(consumer) { - delete this.consumers[getUid(consumer)]; - } } export default LabelCache; diff --git a/src/ol/render/canvas/TextBuilder.js b/src/ol/render/canvas/TextBuilder.js index 40c760256e..641801dba5 100644 --- a/src/ol/render/canvas/TextBuilder.js +++ b/src/ol/render/canvas/TextBuilder.js @@ -131,8 +131,6 @@ class CanvasTextBuilder extends CanvasBuilder { * @type {string} */ this.strokeKey_ = ''; - - labelCache.prune(); } /** @@ -140,6 +138,7 @@ class CanvasTextBuilder extends CanvasBuilder { */ finish() { const instructions = super.finish(); + labelCache.expireCache(); instructions.textStates = this.textStates; instructions.fillStates = this.fillStates; instructions.strokeStates = this.strokeStates; diff --git a/src/ol/renderer/canvas/VectorLayer.js b/src/ol/renderer/canvas/VectorLayer.js index b451a01b88..8fd84962ac 100644 --- a/src/ol/renderer/canvas/VectorLayer.js +++ b/src/ol/renderer/canvas/VectorLayer.js @@ -384,9 +384,6 @@ class CanvasVectorLayerRenderer extends CanvasLayerRenderer { return true; } - if (this.replayGroup_) { - this.replayGroup_.dispose(); - } this.replayGroup_ = null; this.dirty_ = false; diff --git a/src/ol/renderer/canvas/VectorTileLayer.js b/src/ol/renderer/canvas/VectorTileLayer.js index 834725493e..9c0974fa91 100644 --- a/src/ol/renderer/canvas/VectorTileLayer.js +++ b/src/ol/renderer/canvas/VectorTileLayer.js @@ -218,12 +218,6 @@ class CanvasVectorTileLayerRenderer extends CanvasTileLayerRenderer { const sourceTiles = source.getSourceTiles(pixelRatio, projection, tile); const layerUid = getUid(layer); - const executorGroups = tile.executorGroups[layerUid]; - if (executorGroups) { - for (let i = 0, ii = executorGroups.length; i < ii; ++i) { - executorGroups[i].dispose(); - } - } delete tile.hitDetectionImageData[layerUid]; tile.executorGroups[layerUid] = []; for (let t = 0, tt = sourceTiles.length; t < tt; ++t) { diff --git a/test/spec/ol/render/canvas/labelcache.test.js b/test/spec/ol/render/canvas/labelcache.test.js index fa2fcd8f79..d6c5fb8531 100644 --- a/test/spec/ol/render/canvas/labelcache.test.js +++ b/test/spec/ol/render/canvas/labelcache.test.js @@ -2,25 +2,11 @@ import LabelCache from '../../../../../src/ol/render/canvas/LabelCache.js'; describe('ol.render.canvas.LabelCache', function() { - it('#prune()', function() { + it('#expireCache()', function() { const labelCache = new LabelCache(1); labelCache.set('key1', document.createElement('canvas')); labelCache.set('key2', document.createElement('canvas')); - labelCache.prune(); - expect(labelCache.getCount()).to.be(1); - }); - - it('#prune() leaves used labels untouched until consumer is released', function() { - const labelCache = new LabelCache(1); - labelCache.set('key1', document.createElement('canvas')); - labelCache.set('key2', document.createElement('canvas')); - const consumer = {}; - labelCache.get('key1', consumer); - labelCache.get('key2', consumer); - labelCache.prune(); - expect(labelCache.getCount()).to.be(2); - labelCache.release(consumer); - labelCache.prune(); + labelCache.expireCache(); expect(labelCache.getCount()).to.be(1); });