【问题标题】:Efficiently create bitmap for map markers有效地为地图标记创建位图
【发布时间】:2014-04-16 00:10:25
【问题描述】:

我正在使用 android google maps v2,我正在创建地图标记并分配位图。我正在从我的资产目录中获取位图。我从资产中获取它们的原因是我用来查找“正确”图标的路径是动态的。

我的问题是我是否应该保存底层位图,以便我可以一次又一次地重复使用它。我读: http://developer.android.com/training/displaying-bitmaps/manage-memory.html

但坦率地说,很多非常大的示例项目都在我头上。

我应该在每次需要将位图传递给标记进行创建时重新创建位图,还是应该将每个位图(不超过限制)读入内存并保存以供重复使用。

不管怎样,每个都会被绘制在地图上,所以我不确定我是否可以重复使用。

示例:我在地图上有 300 个标记,有 20 个可能的位图。 IE。大约 15% 是相同的标记图标。

【问题讨论】:

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


    【解决方案1】:

    由于位图解码是一项非常昂贵的操作,我肯定会推荐使用位图缓存。特别是在您的情况下,当唯一位图的数量远小于地图上的标记数量时。简单的[LruCache][1] - 基于内存的缓存可以正常工作。您只需要注意缓存使用了多少内存即可。

    这是一个如何实现内存缓存的好例子: 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;
    }
    

    【讨论】:

    • 非常感谢。快速跟进您的答案。我修改了一些代码以将 inBitmap 添加到我的选项中(如果我缓存了一个)。但是我不是 100% 确定它使用我给它的位图。有没有办法告诉我?
    • 这不是我的意思。 inBitmapBitmapFactory 使用(不是 BitmapDescriptorFactory)。 inBitmap 可以帮助您重用现有的预分配位图来解码另一个位图,但我的意思是 - 缓存 BitmapDescriptor
    • @PavelDudka 谢谢你的回答,但它不包括正确计算 BitmapDescriptor 大小的方法@Override protected int sizeOf(...)
    • 任何人都可以确认这会在所有标记都被渲染后提高地图滚动性能吗?还是只有在首次添加标记时才能获得性能提升?
    猜你喜欢
    • 2020-06-02
    • 1970-01-01
    • 1970-01-01
    • 2018-09-26
    • 2018-01-28
    • 2013-02-25
    • 2012-01-09
    • 2013-05-14
    • 1970-01-01
    相关资源
    最近更新 更多