1. Bitmap 占用内存分析及常见优化
分析工具:AS3.0以上使用 Android Profile
,以下可以使用 Android Device Monitor
优化:
- 耗时操作可以通过
Rxjava
去切换到子线程处理 - 如果涉及到高斯模糊,从网络上下载的大图,根据ui需求,通过 Glide 重新调整其大小(这样减少高斯模糊的计算时间)
- 使用LruCache 缓存,根据不同机型分配 不同的缓存 大小
1.1 Lrucache 两个点记录
- 记得重写 Lrucache 的
sizeOf(K key, V value)
方法为缓存的单个对象的大小,不然默认为 1 - 内存大小可以根据不同手机等条件动态设置
Glide 的 MemoryCache
的缓存大小为:(一个屏幕图片大小=widthPixels*heightPixels*4)* 2
LruCache实际上就是一个 LinkedHashMap( 补充知识:LinkedHashMap是一个双向循环列表,不支持线程安全,LruCache对它进行了封装添加了线程安全操作),里面保存了一定数量的对象强引用
,
每次添加的新对象都是在链表的头,当分配的空间用完的时候会把末尾的对象移除,移除的对象就可以被gc回收了
1 | // 缓存图片 |
2. 图像模糊
2.1 均值模糊
操作:对当前像素点的周边半径,进行相加然后取平均值,赋值给当前像素点。
2.2 高斯模糊
操作: 对当前像素点的周边半径,求权重计算周边像素值,然后相加赋值给当前像素点。
每个像素点都要处理,还有就是要去计算我们的正太分布的值(卷积核) 如果半径越大,算法的复杂度越大,如果图片的宽高像素点越多,算法的复杂度也越大高斯和均值模糊的区别:高斯保留了一些轮廓,毛玻璃的效果
1 | int main(){ |