一、背景
在百度地图、高德地图上显示Marker, 如果显示数量很多时,滑动地图会出现卡顿的现象。 根本原因是地图是个耗内存的功能, 我们看到的地图和marker都是Bitmap。 想想在手机屏幕上添加100个小的Bitmap和背景的大Bitmap需要多少内存? 这些图片没有复用机制,都是储存在Java堆里,显示的Marker越多占用的内存越多。
滑动地图时可能出现卡顿甚至ANR的现象, 其实就是内存开销太大了,地图上显示了过多的Marker。
(Java_com_baidu_mapsdkplatform_comjni_map_basemap_JNIBaseMap_addOneOverlayItem+106)
native: #06 pc 00003c47 /data/app/com.lianjia.beike-yIWV6AK0FFsvTyKR4wM2sA==/oat/arm/base.odex (Java_com_baidu_mapsdkplatform_comjni_map_basemap_JNIBaseMap_addOneOverlayItem__JLandroid_os_Bundle_2+110)
at com.baidu.mapsdkplatform.comjni.map.basemap.JNIBaseMap.addOneOverlayItem(Native method)
at com.baidu.mapsdkplatform.comjni.map.basemap.a.f(unavailable:-1)
at com.baidu.mapsdkplatform.comapi.map.e.b(unavailable:-1)
...
什么是“多”? 这个词缺少量化的标准。 不同性能的手机可以显示的Marker最大数量也是不同的。
二、优化方法
优化方法.png
一些业务在滑动屏幕时会删除所有地图上的Marker, 然后添加新的Marker点。 这种操作方式不存在内存开销大的问题, 可以忽略上面的方法;
使用缓存的优点是拖动屏幕时可以看到以前的Marker, 缺点是管理好Marker数量(避免内存开销大导致的卡顿)。
三、目标
缩放、滑动地图时可以看到缓存数据且操作流畅, 不会出现卡顿现象;
由于手机性能限制, 既要充分利用手机资源又要保证地图操作流畅, 需要合理的管理Marker的添加、删除行为。 每个Marker都是张Bitmap,太多了手机扛不住。
网友评论