diff --git a/src/ol/renderer/canvas/canvasmaprenderer.js b/src/ol/renderer/canvas/canvasmaprenderer.js index b5e6d80458..0de485157b 100644 --- a/src/ol/renderer/canvas/canvasmaprenderer.js +++ b/src/ol/renderer/canvas/canvasmaprenderer.js @@ -153,6 +153,6 @@ ol.renderer.canvas.Map.prototype.renderFrame = function(frameState) { this.renderedVisible_ = true; } - this.removeUnusedLayerRenderers(frameState); + this.scheduleRemoveUnusedLayerRenderers(frameState); }; diff --git a/src/ol/renderer/dom/dommaprenderer.js b/src/ol/renderer/dom/dommaprenderer.js index 4866a11763..14072ba424 100644 --- a/src/ol/renderer/dom/dommaprenderer.js +++ b/src/ol/renderer/dom/dommaprenderer.js @@ -93,6 +93,6 @@ ol.renderer.dom.Map.prototype.renderFrame = function(frameState) { } this.calculateMatrices2D(frameState); - this.removeUnusedLayerRenderers(frameState); + this.scheduleRemoveUnusedLayerRenderers(frameState); }; diff --git a/src/ol/renderer/maprenderer.js b/src/ol/renderer/maprenderer.js index 70a36d840e..9f9690870d 100644 --- a/src/ol/renderer/maprenderer.js +++ b/src/ol/renderer/maprenderer.js @@ -241,24 +241,35 @@ ol.renderer.Map.prototype.removeLayerRendererByKey_ = function(layerKey) { ol.renderer.Map.prototype.renderFrame = goog.nullFunction; +/** + * @param {ol.Map} map Map. + * @param {!ol.FrameState} frameState Frame state. + * @private + */ +ol.renderer.Map.prototype.removeUnusedLayerRenderers_ = + function(map, frameState) { + var layerStates = frameState.layerStates; + var layerKey; + for (layerKey in this.layerRenderers_) { + if (!(layerKey in layerStates)) { + goog.dispose(this.removeLayerRendererByKey_(layerKey)); + } + } +}; + + /** * @param {!ol.FrameState} frameState Frame state. * @protected */ -ol.renderer.Map.prototype.removeUnusedLayerRenderers = +ol.renderer.Map.prototype.scheduleRemoveUnusedLayerRenderers = function(frameState) { - var layerRenderersToRemove = {}; var layerKey; for (layerKey in this.layerRenderers_) { - layerRenderersToRemove[layerKey] = true; - } - var layersArray = frameState.layersArray; - var i; - for (i = 0; i < layersArray.length; ++i) { - layerKey = goog.getUid(layersArray[i]).toString(); - delete layerRenderersToRemove[layerKey]; - } - for (layerKey in layerRenderersToRemove) { - goog.dispose(this.removeLayerRendererByKey_(layerKey)); + if (!(layerKey in frameState.layerStates)) { + frameState.postRenderFunctions.push( + goog.bind(this.removeUnusedLayerRenderers_, this)); + return; + } } }; diff --git a/src/ol/renderer/webgl/webglmaprenderer.js b/src/ol/renderer/webgl/webglmaprenderer.js index 3aed6a4972..465a2ab8d2 100644 --- a/src/ol/renderer/webgl/webglmaprenderer.js +++ b/src/ol/renderer/webgl/webglmaprenderer.js @@ -641,6 +641,6 @@ ol.renderer.webgl.Map.prototype.renderFrame = function(frameState) { frameState.animate = true; } - this.removeUnusedLayerRenderers(frameState); + this.scheduleRemoveUnusedLayerRenderers(frameState); };