Утечка памяти MarkerClustererPlus при скрытии кластеров

У меня есть 4 разных типа маркеров на одной карте. В настоящее время слайд-шоу чередуется между каждым типом, скрывая остальные 3. Существует объект MarkerClusterer для каждого отдельного типа маркера, чтобы они не группировались вместе.

Проблема, с которой я сталкиваюсь, заключается в том, что снимок кучи в chrome показывает, что я увеличиваю объем используемой памяти примерно на 2 МБ каждые 5 минут или около того. Это мой код в настоящее время:

function transitionMarkers() {
    if (isSlideShowActive) {
        for (var i = 0; i < markers.length; i++) {
            if (nutrientsArray[slideShowCounter] === markers[i].address.SOURCE_GROUP) {
                markers[i].setVisible(true);
            } else {
                markers[i].setVisible(false);
            }
        }
        for (var n in types.NUTRIENTS) {
            for (var sc in types.SOURCE_CODES) {
                if (nutrientsArray[slideShowCounter] === n) {
                    markerClusters[n][sc].setMap(map);
                } else {
                    markerClusters[n][sc].setMap(null);
                }
            }
        }
    }
    incrementSlideShowCounter();
}

Маркеры имеют возможность изменять свою видимость, и, поскольку они будут перерисованы в течение минуты, я не беспокоюсь об использовании для них setMap(null). Однако кластеры маркеров не имеют такой возможности. Когда я изучаю снимок кучи, я вижу тысячи объектов, которые выглядят так:

[1076] :: pf @2451465 5 360 % 2 3360 %
b :: gi @2273271 2 120 % 170 5441 %
e :: function() @2454527 6 360 % 2 3000 %
< strong>proto :: pf @2338839 5 120 % 360 %
d :: "bounds_changed" @67519

Похоже, что там накапливаются тысячи этих событий bounds_changed... моя карта только скрывает или показывает маркеры, она не перемещается, не увеличивается или не уменьшается или что-то в этом роде.

есть идеи?


person Brett McLain    schedule 27.06.2013    source источник


Ответы (1)


Эти bounds_changed-события будут привязаны к карте, когда будет добавлено ClusterIcon (происходит все время, когда вы вызываете markerClusters[n][sc].setMap(map)).

Когда вы вызываете markerClusters[n][sc].setMap(null), ClusterIcons будут удалены, метод onRemove также очищает всех слушателей, привязанных к ClusterIcon-экземплярам, ​​но метод onRemove-метод не удаляет bounds_changed-события, привязанные к карте (вы можете назвать это ошибкой).

Таким образом, вы можете либо исправить ошибку самостоятельно, либо изменить markerclusterer.js так, чтобы он также удалял событие bounds_changed, либо вообще не вызывать setMap(), вместо этого вы можете, например, вызовите методы show() или hide() экземпляров ClusterIcon, чтобы отобразить или скрыть их (должно быть эффективнее).

person Dr.Molle    schedule 01.07.2013