【发布时间】:2021-11-16 14:33:02
【问题描述】:
我正在使用 openlayers 6.7.0 开发一个应用程序,我在其中动态添加和删除地图上的图层。这些图层是带有 GeoTIFF 源的 WebGL 切片图层。该应用程序具有 1..N 个地图,每个地图有 X 个图层,每个图层有 Y 个 GeoTIFF 源。这些层经常被删除并被新层替换。地图组件很少被删除或添加,但也会发生。
尽管复杂,但应用程序和 OL 运行良好。但是,在使用该应用程序一段时间后,我的浏览器开始向我发出有关过多活动 WebGL 上下文的警告。我在这篇文章的底部添加了一个带有堆栈跟踪的示例错误消息。
似乎我的代码或 OpenLayers 没有正确删除 WebGL 上下文,并且我还没有找到解释如何清理已删除层的文档。我找到的最好的是Layer.dispose(),我尝试使用以下代码删除已删除的图层,但这并没有解决问题:
const previousLayers = [] as Layer<any>[]
map.getLayers().forEach((l : Layer<any>) => previousLayers.push(l))
map.getLayers().clear();
previousLayers.forEach(l => l.dispose())
所以我的问题是:如何清理旧层以便这些层释放所有底层资源?
以下是有关 WebGL 上下文的示例错误消息。 Linux 上的 Chrome,OpenLayers 6.7.0。
webgl.js:95 WARNING: Too many active WebGL contexts. Oldest context will be lost.
getContext @ webgl.js:95
WebGLHelper @ Helper.js:266
WebGLLayerRenderer @ Layer.js:65
WebGLTileLayerRenderer @ TileLayer.js:121
WebGLTileLayer.createRenderer @ WebGLTile.js:303
Layer.getRenderer @ Layer.js:326
Layer.render @ Layer.js:254
CompositeMapRenderer.renderFrame @ Composite.js:122
PluggableMap.renderFrame_ @ PluggableMap.js:1418
(anonymous) @ PluggableMap.js:213
requestAnimationFrame (async)
PluggableMap.render @ PluggableMap.js:1327
Target.dispatchEvent @ Target.js:110
Observable.changed @ Observable.js:72
LayerGroup.handleLayerChange_ @ Group.js:121
Target.dispatchEvent @ Target.js:110
Observable.changed @ Observable.js:72
Layer.handleSourceChange_ @ Layer.js:210
Target.dispatchEvent @ Target.js:110
Observable.changed @ Observable.js:72
Source.setState @ Source.js:178
GeoTIFFSource.configure_ @ GeoTIFF.js:546
(anonymous) @ GeoTIFF.js:348
Promise.then (async)
GeoTIFFSource @ GeoTIFF.js:346
(anonymous) @ OpenLayersMap.tsx:165
(anonymous) @ OpenLayersMap.tsx:136
invokePassiveEffectCreate @ react-dom.development.js:23487
callCallback @ react-dom.development.js:3945
invokeGuardedCallbackDev @ react-dom.development.js:3994
invokeGuardedCallback @ react-dom.development.js:4056
flushPassiveEffectsImpl @ react-dom.development.js:23574
unstable_runWithPriority @ scheduler.development.js:468
runWithPriority$1 @ react-dom.development.js:11276
flushPassiveEffects @ react-dom.development.js:23447
(anonymous) @ react-dom.development.js:23324
workLoop @ scheduler.development.js:417
flushWork @ scheduler.development.js:390
performWorkUntilDeadline @ scheduler.development.js:157
【问题讨论】:
-
可以将 l 设置为 null 吗?
-
清理 WebGL 上下文需要主动工作(调用 WebGL API),将某些内容设置为 null 是不够的。
标签: openlayers