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

时间:2016-03-23 22:15:28

标签: javascript garbage-collection openlayers-3

我有一个问题,ol.render.canvas.ReplayGroup对象没有被放到垃圾收集。

这个用于的图层是ol.layer.Image,它是从ol.source.ImageVector创建的,而ol.source.ImageVector是从ol.source.Vector源创建的。

我想要导致一些垃圾收集的事件序列是,    使用setStyle(null)将Image的样式设置为null;    然后使用setSource(null)将Image的源设置为null;    然后使用setMap(null);

从地图中删除ol.layer.Image对象

这会导致图层从地图中删除(我想,它会消失),但是当我使用Chrome的堆分配配置文件对网页进行配置时,canvas.ReplayGroup对象仍然存在,永远不会再次使用。

这是其他人遇到过的吗?我试图使用map.addLayer()而不是layer.setMap(),结果相同。

== edit ==

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

1 个答案:

答案 0 :(得分:1)

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

在ol.source.ImageVector中,它是ol.layer.Image的源代码,我找到了一个名为replayGroup_的重播组类的引用。设置私密'将图层源设置为null后将属性设置为null会导致垃圾回收.. yay!

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

这对我现在有用