Openlayers 3-如何垃圾收集Canvas ReplayGroup对象

Openlayers 3 - How to garbage collect Canvas ReplayGroup objects?

本文关键字:Canvas ReplayGroup 对象 何垃圾 Openlayers      更新时间:2023-09-26

我遇到了ol.render.canvas.ReplayGroup对象未被放入垃圾收集的问题。

它所针对的层是ol.layer.Image,它是从ol.source.ImageVector创建的,反过来又是从ol.source.Vector源创建的。

我希望导致一些垃圾收集的事件序列是,使用setStyle(null)将图像的样式设置为null;则使用setSource(null)将图像的源设置为null;则使用setMap(null)从映射中移除ol.layer.Image对象;

这确实会导致该层从地图中删除(我认为它会消失),但当我用Chrome的堆分配配置文件(画布)对网页进行配置时。ReplayGroup对象仍然存在,永远不会再使用。

这是别人碰到的东西吗?我尝试使用map.addLayer()而不是layer.setMap(),结果相同。

===编辑===

我忘了写,ol.layer.Image已经添加到ol.layer.Group中。更具体地说,上面的最后一部分是map.addLayer(Group)和Group.getLayers().forEach(function(l){l.setMap(map);}),看起来没有什么区别。

https://github.com/openlayers/ol3/blob/master/src/ol/source/imagevectorsource.js

在ol.layer.Image的源ol.source.ImageVector中,我发现了一个名为replayGroup_的重播组类的引用。在将层源设置为null之后,将"private"属性设置为null将导致垃圾回收。。耶!

var imageVector = layer.getSource();
layer.setSource(null);
imageVector.setStyle(null);
imageVector.replayGroup_ = null;
imageVector = null;

这对我现在有效