高效创建地图标记的位图

9
我正在使用Android Google Maps v2,创建地图标记并分配位图。我正在从我的asset目录中获取位图。我之所以这样做是因为我用于查找“正确”图标的路径是动态的。
我的问题是,我应该保存底层位图,以便我可以一遍又一遍地重复使用它们吗?我阅读了http://developer.android.com/training/displaying-bitmaps/manage-memory.html,但老实说,其中许多真正大的示例项目对我来说过于难以理解。
每次需要将其传递给标记进行创建时,我应该重新创建位图,还是应该将每个位图(最多)读入内存并保存以供重复使用?
无论如何,每个都将在地图上绘制,所以我不确定我是否可以重复使用。例如:我有300个标记在地图上,有20种可能的位图。即大约15%是相同的标记图标。
1个回答

4

由于位图解码是一项非常耗费资源的操作,我强烈建议使用位图缓存。特别是在您的情况下,唯一位图的数量远小于地图标记的数量。一个简单的基于 LruCache 的内存缓存就可以很好地工作。您需要注意的是,要确定为缓存使用多少内存。

以下是实现内存缓存的好例子:http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html

后续

我认真思考了一下,您可以做得更好。不是缓存位图,而是缓存每个唯一位图的 BitmapDescriptor。这样,您可以在需要创建标记时避免每次调用 BitmapDescriptorFactory 以获得额外的性能。

更新

我是这个意思:

LruCache<String, BitmapDescriptor> cache;

private void initCache()
{
    //Use 1/8 of available memory
    cache = new LruCache<String, BitmapDescriptor>((int)(Runtime.getRuntime().maxMemory() / 1024 / 8));
}

private void addMarker(LatLng position, String assetPath)
{
    MarkerOptions opts = new MarkerOptions();
    opts.icon(getBitmapDescriptor(assetPath));
    opts.position(position);
    mMap.addMarker(opts);
}

private BitmapDescriptor getBitmapDescriptor(String path) {
    BitmapDescriptor result = cache.get(path);
    if (result == null) {
        result = BitmapDescriptorFactory.fromAsset(path);
        cache.put(path, result);
    }

    return result;
}

1
非常感谢。关于您的回答,我有一个快速的跟进。我修改了一些代码,将inBitmap添加到我的选项中(如果我有一个缓存)。但是我不确定它是否正在使用我提供的位图。有没有办法可以告诉我? - lostintranslation
这不完全是我想要的。inBitmap 是由 BitmapFactory 使用的(而不是 BitmapDescriptorFactory)。inBitmap 可以帮助您重用已预先分配的位图来解码另一个位图,但我所指的是缓存 BitmapDescriptor - Pavel Dudka
1
@PavelDudka 谢谢您的回答,但它并没有包括一种正确计算BitmapDescriptor大小的方法。@Override protected int sizeOf(...) - Eric Kim
有人能确认一下,这种做法是在所有标记都被渲染出来之后才会提高地图滚动性能吗?还是只有在第一次添加标记时才会获得性能提升? - zerox1212

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接