2016-03-23 5 views
1

У меня проблема с объектами ol.render.canvas.ReplayGroup, которые не выпускаются в сборку мусора.Openlayers 3 - Как мусор собирать объекты Canvas ReplayGroup?

Слой, для которого это предназначено, является ol.layer.Image, созданный из ol.source.ImageVector, в свою очередь, созданный из источника ol.source.Vector.

Последовательность событий, которые я хотел бы получить в некоторых сборках мусора: Стиль изображения установлен в null с помощью setStyle (null); , тогда для источника изображения установлено значение null с помощью setSource (null); , тогда объект ol.layer.Image удаляется с карты с помощью setMap (null);

Это приводит к удалению слоя с карты (я думаю, он исчезает), но когда я просматриваю веб-страницу с профилем распределения кучи Chrome, объект canvas.ReplayGroup все еще существует, никогда не будет использоваться снова ,

Это что-то еще? Я попытался использовать map.addLayer() вместо layer.setMap(), те же результаты.

== == редактировать

Я забыл написать, то ol.layer.Image было добавлено к ol.layer.Group. Более конкретно, последняя часть выше была map.addLayer (group), а также group.getLayers(). ForEach (function (l) {l.setMap (map);}), никакой разницы не возникает.

ответ

1

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

В ol.source.ImageVector это источник для ol.layer.Image, я нашел ссылку на классы переигровка группы под названием replayGroup_. Установка этого свойства «private» на null после установки источника слоя в null приводит к сбору мусора .. yay!

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

Это работает для меня на данный момент

Смежные вопросы