当绘制/更新标记时,android google maps v2 lag

时间:2013-05-26 23:33:07

标签: google-maps-android-api-2

在Google Maps API v2中管理标记的正确方法是什么?我正在尝试仅使用在该区域内可见的标记更新视口,并且我使用OnCameraChangeListener知道何时使用最新标记更新视口。但是,无论何时绘制或更新标记,地图都不可滚动/缩放。我注意到当使用setIcon()时,滞后更严重。在Google Maps v1中,当我使用ItemizedOverlays时,我从未遇到过这个问题。这里是我的代码的主旨,在滚动/缩放中经历了滞后:

private void updatePinsOnMap(MapDisplayData mapDisplayData) {
    BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromBitmap(getPinWithBadgeCount(2));
    List<LatLng> latlngs = Lists.newArrayList();
    for (NearbyPlaceEdge place : mapDisplayData.getPlaces()) {
        latlngs.add(place.latlng);
    }
    for (NearbyPlaceCluster cluster : mapDisplayData.getClusters()) {
        latlngs.add(cluster.latlng);
    }
    int numMarkersToPlot = latlngs.size();
    for (int i = 0; i < numMarkersToPlot; i++) {
        if (i < mMarkers.size()) {
            // recycle
            mMarkers.get(i).setPosition(latlngs.get(i));
        } else {
            final Marker m = mGoogleMap.addMarker(
                new MarkerOptions()
                    .position(latlngs.get(i))
                    .icon(bitmapDescriptor)
            );
            mMarkers.add(m);
        }
    }
    for (int i = mMarkers.size() - 1; i >= numMarkersToPlot; i--) {
        mMarkers.remove(i).remove();
    }
}

更新:

我使用上面的代码创建了一个示例应用程序,并且根据计划工作(即没有懒散)。我花了一些时间考虑这个问题,并且我认为这与Google Maps v2所需的内存有关。从查看logcat,每次我移动地图 - 触发地图更新 - 我在Nexus 4上得到了很多这样的gc消息

05-27 14:28:23.701: D/dalvikvm(2849): GC_FOR_ALLOC freed 1198K, 23% free 26889K/34504K, paused 112ms, total 112ms

这是API中潜在的内存泄漏吗?我现有的应用程序已经占用了一些内存,但我认为GMaps将能够根据可用内容适当地管理自己的内存。

1 个答案:

答案 0 :(得分:1)

看起来你对API的调用太多了。

每次调用setPosition,remove和addMarker都在做IPC。如果可能的话,我建议将其限制在低于100的数字。

从代码中我看到你正在进行某种聚类,这是一个良好的开端。

我还建议不要为屏幕外的标记调用remove(除非必要,例如,因为缩放更改而更改群集)并保持标记的标识,因此保留在屏幕上的标记不会重新定位或以其他方式修改。

使用Android Maps Extensions群集引擎时,我对20000个标记没有问题,这就是我所描述的。

问题更新后更新:

现在有一个不同的故事。您的应用使用大约25 MB。这对于Maps API v2来说会有问题,因为每次调用(就像我之前说的那样)都在进行IPC,而IPC又会根据this answer和其他来源强制GC。堆越大意味着GC需要的时间越多。

解决方案?最好保持内存占用率更低。