我在单张地图上有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事件在那里累积...我的地图只隐藏或显示标记,它不会移动,放大或缩小,或类似的东西。
有什么想法吗?
答案 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
来显示或隐藏它们(应该提供更好的性能)。