Remove memory leak caused by label cache listeners
This commit is contained in:
@@ -3,8 +3,6 @@
|
||||
*/
|
||||
import {abstract, getUid} from '../util.js';
|
||||
import Disposable from '../Disposable.js';
|
||||
import {listen, unlistenByKey} from '../events.js';
|
||||
import EventType from '../events/EventType.js';
|
||||
import {getWidth} from '../extent.js';
|
||||
import {TRUE} from '../functions.js';
|
||||
import {visibleAtResolution} from '../layer/Layer.js';
|
||||
@@ -34,18 +32,6 @@ class MapRenderer extends Disposable {
|
||||
*/
|
||||
this.declutterTree_ = null;
|
||||
|
||||
/**
|
||||
* @private
|
||||
* @type {!Object<string, import("./Layer.js").default>}
|
||||
*/
|
||||
this.layerRenderers_ = {};
|
||||
|
||||
/**
|
||||
* @private
|
||||
* @type {Object<string, import("../events.js").EventsKey>}
|
||||
*/
|
||||
this.layerRendererListeners_ = {};
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -75,15 +61,6 @@ class MapRenderer extends Disposable {
|
||||
makeInverse(pixelToCoordinateTransform, coordinateToPixelTransform);
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes all layer renderers.
|
||||
*/
|
||||
removeLayerRenderers() {
|
||||
for (const key in this.layerRenderers_) {
|
||||
this.removeLayerRendererByKey_(key).dispose();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {import("../coordinate.js").Coordinate} coordinate Coordinate.
|
||||
* @param {import("../PluggableMap.js").FrameState} frameState FrameState.
|
||||
@@ -149,8 +126,8 @@ class MapRenderer extends Disposable {
|
||||
for (i = numLayers - 1; i >= 0; --i) {
|
||||
const layerState = layerStates[i];
|
||||
const layer = /** @type {import("../layer/Layer.js").default} */ (layerState.layer);
|
||||
if (visibleAtResolution(layerState, viewResolution) && layerFilter.call(thisArg2, layer)) {
|
||||
const layerRenderer = this.getLayerRenderer(layer);
|
||||
if (layer.hasRenderer() && visibleAtResolution(layerState, viewResolution) && layerFilter.call(thisArg2, layer)) {
|
||||
const layerRenderer = layer.getRenderer();
|
||||
const source = layer.getSource();
|
||||
if (layerRenderer && source) {
|
||||
const callback = forEachFeatureAtCoordinate.bind(null, layerState.managed);
|
||||
@@ -203,35 +180,6 @@ class MapRenderer extends Disposable {
|
||||
return hasFeature !== undefined;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {import("../layer/Layer.js").default} layer Layer.
|
||||
* @protected
|
||||
* @return {import("./Layer.js").default} Layer renderer. May return null.
|
||||
*/
|
||||
getLayerRenderer(layer) {
|
||||
const layerKey = getUid(layer);
|
||||
if (layerKey in this.layerRenderers_) {
|
||||
return this.layerRenderers_[layerKey];
|
||||
}
|
||||
|
||||
const renderer = layer.getRenderer();
|
||||
if (!renderer) {
|
||||
return null;
|
||||
}
|
||||
|
||||
this.layerRenderers_[layerKey] = renderer;
|
||||
this.layerRendererListeners_[layerKey] = listen(renderer, EventType.CHANGE, this.handleLayerRendererChange_, this);
|
||||
return renderer;
|
||||
}
|
||||
|
||||
/**
|
||||
* @protected
|
||||
* @return {Object<string, import("./Layer.js").default>} Layer renderers.
|
||||
*/
|
||||
getLayerRenderers() {
|
||||
return this.layerRenderers_;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return {import("../PluggableMap.js").default} Map.
|
||||
*/
|
||||
@@ -239,29 +187,6 @@ class MapRenderer extends Disposable {
|
||||
return this.map_;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle changes in a layer renderer.
|
||||
* @private
|
||||
*/
|
||||
handleLayerRendererChange_() {
|
||||
this.map_.render();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {string} layerKey Layer key.
|
||||
* @return {import("./Layer.js").default} Layer renderer.
|
||||
* @private
|
||||
*/
|
||||
removeLayerRendererByKey_(layerKey) {
|
||||
const layerRenderer = this.layerRenderers_[layerKey];
|
||||
delete this.layerRenderers_[layerKey];
|
||||
|
||||
unlistenByKey(this.layerRendererListeners_[layerKey]);
|
||||
delete this.layerRendererListeners_[layerKey];
|
||||
|
||||
return layerRenderer;
|
||||
}
|
||||
|
||||
/**
|
||||
* Render.
|
||||
* @param {?import("../PluggableMap.js").FrameState} frameState Frame state.
|
||||
@@ -279,21 +204,6 @@ class MapRenderer extends Disposable {
|
||||
frameState.postRenderFunctions.push(expireIconCache);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {!import("../PluggableMap.js").FrameState} frameState Frame state.
|
||||
* @protected
|
||||
*/
|
||||
scheduleRemoveUnusedLayerRenderers(frameState) {
|
||||
const layerStatesMap = getLayerStatesMap(frameState.layerStatesArray);
|
||||
for (const layerKey in this.layerRenderers_) {
|
||||
if (!(layerKey in layerStatesMap)) {
|
||||
frameState.postRenderFunctions.push(function() {
|
||||
this.removeLayerRendererByKey_(layerKey).dispose();
|
||||
}.bind(this));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -305,15 +215,4 @@ function expireIconCache(map, frameState) {
|
||||
iconImageCache.expire();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Array<import("../layer/Layer.js").State>} layerStatesArray Layer states array.
|
||||
* @return {Object<string, import("../layer/Layer.js").State>} States mapped by layer uid.
|
||||
*/
|
||||
function getLayerStatesMap(layerStatesArray) {
|
||||
return layerStatesArray.reduce(function(acc, state) {
|
||||
acc[getUid(state.layer)] = state;
|
||||
return acc;
|
||||
}, {});
|
||||
}
|
||||
|
||||
export default MapRenderer;
|
||||
|
||||
Reference in New Issue
Block a user