隐藏群集时MarkerClustererPlus内存泄漏

时间:2013-06-27 19:45:08

标签: google-maps google-maps-api-3 google-maps-markers markerclusterer

我在单张地图上有4种不同类型的标记。目前,幻灯片旋转通过每种类型,隐藏其他类型3.每种不同类型的标记都有一个MarkerClusterer对象,因此它们不会聚集在一起。

我遇到的问题是chrome中的堆快照显示我每5分钟左右就会增加大约2mb的内存量。这是我目前的代码:

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%
proto :: pf @ 2338839 5 120%360%
d ::“bounds_changed”@ 67519

看起来有成千上万的这些bounds_changed事件在那里累积...我的地图只隐藏或显示标记,它不会移动,放大或缩小,或类似的东西。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

这些bounds_changed - 事件将在添加ClusterIcon时绑定到地图(当您致电markerClusters[n][sc].setMap(map)时始终发生)。

当您调用markerClusters[n][sc].setMap(null)时,将删除ClusterIcons,onRemove方法也会清除绑定到ClusterIcon - 实例的所有侦听器,但onRemove方法不会删除bounds_changed - 绑定到地图的事件(你可以称之为bug)。

因此,您可以自行修复错误并修改markerclusterer.js,以便它也删除bounds_changed事件,或者根本不调用setMap(),而您可以例如调用show() - 实例的方法hide()ClusterIcon来显示或隐藏它们(应该提供更好的性能)。