1

我在一张地图上有 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 事件正在累积......我的地图只隐藏或显示标记,它不会四处移动、放大或缩小或类似的东西。

有什么想法吗?

4

1 回答 1

1

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

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

因此,您可以自行修复错误并修改 markerclusterer.js 以便它也删除 bounds_changed-event,或者根本不调用setMap(),而是可以调用方法show()或-instanceshide()ClusterIcon显示或隐藏他们(应该有更好的表现)。

于 2013-07-01T03:36:11.550 回答