Merge pull request #13336 from MoonE/dispose-webgl

Dispose of webgl contexts
This commit is contained in:
MoonE
2022-02-07 22:38:36 +01:00
committed by GitHub
10 changed files with 114 additions and 88 deletions

View File

@@ -390,7 +390,9 @@ class WebGLTileLayer extends BaseTileLayer {
* @private
*/
handleSourceUpdate_() {
this.setStyle(this.style_);
if (this.getSource()) {
this.setStyle(this.style_);
}
}
/**

View File

@@ -95,7 +95,7 @@ class WebGLLayerRenderer extends LayerRenderer {
*/
this.helper;
layer.addChangeListener(LayerProperty.MAP, this.removeHelper_.bind(this));
layer.addChangeListener(LayerProperty.MAP, this.removeHelper.bind(this));
this.dispatchPreComposeEvent = this.dispatchPreComposeEvent.bind(this);
this.dispatchPostComposeEvent = this.dispatchPostComposeEvent.bind(this);
@@ -148,7 +148,10 @@ class WebGLLayerRenderer extends LayerRenderer {
}
}
removeHelper_() {
/**
* @protected
*/
removeHelper() {
if (this.helper) {
this.helper.dispose();
delete this.helper;
@@ -187,9 +190,7 @@ class WebGLLayerRenderer extends LayerRenderer {
'map/' + frameState.mapId + '/group/' + groupNumber;
if (!this.helper || !this.helper.canvasCacheKeyMatches(canvasCacheKey)) {
if (this.helper) {
this.helper.dispose();
}
this.removeHelper();
this.helper = new WebGLHelper({
postProcesses: this.postProcesses_,
@@ -227,7 +228,7 @@ class WebGLLayerRenderer extends LayerRenderer {
* Clean up.
*/
disposeInternal() {
this.removeHelper_();
this.removeHelper();
super.disposeInternal();
}

View File

@@ -692,27 +692,33 @@ class WebGLTileLayerRenderer extends WebGLLayerRenderer {
return covered;
}
removeHelper() {
if (this.helper) {
const tileTextureCache = this.tileTextureCache_;
tileTextureCache.forEach((tileTexture) => tileTexture.dispose());
tileTextureCache.clear();
}
super.removeHelper();
}
/**
* Clean up.
*/
disposeInternal() {
const helper = this.helper;
const gl = helper.getGL();
if (helper) {
const gl = helper.getGL();
gl.deleteProgram(this.program_);
delete this.program_;
helper.deleteBuffer(this.indices_);
delete this.indices_;
gl.deleteProgram(this.program_);
delete this.program_;
const tileTextureCache = this.tileTextureCache_;
tileTextureCache.forEach(function (tileTexture) {
tileTexture.dispose();
});
tileTextureCache.clear();
delete this.tileTextureCache_;
helper.deleteBuffer(this.indices_);
}
super.disposeInternal();
delete this.indices_;
delete this.tileTextureCache_;
}
}