探究 Fresco
的实现原理
先看 blog
- 主流图片加载框架ImageLoader、Glide、Picasso、Fresco性能分析 ---- 图片加载速度比较
- Glide,Fresco 框架源码解析 – 结尾 --> 解耦图片加载框架
- Picasso,Glide,Fresco 比较
Fresco 功能列表
- 加载进度提示
- 圆角图片
- 渐进式加载
- 显示动图GIF
- 多图请求
- 监听下载
- 缩放 旋转
缓存处理
Fresco
的缓存也是一大亮点,它采用了三级缓存的方式,分别是:
Bitmap
缓存- 未解码图片缓存
- 图片文件缓存。
public void initFresco(Context context, String diskCacheUniqueName){
DiskCacheConfig diskCacheConfig = DiskCacheConfig.newBuilder(context)
.setMaxCacheSize(DISK_CACHE_SIZE_HIGH)
.setMaxCacheSizeOnLowDiskSpace(DISK_CACHE_SIZE_LOW)
.setMaxCacheSizeOnVeryLowDiskSpace(DISK_CACHE_SIZE_VERY_LOW)
.build();
ImagePipelineConfig config = ImagePipelineConfig.newBuilder(context)
.setMainDiskCacheConfig(diskCacheConfig)
.build();
Fresco.initialize(context, config);
}
注意:在Android 5.0以下,bitmap
缓存位于 ashmem
区域,而在Android 5.0以上,bitmap
和其他框架一样,缓存在 Java Heap
之上。因为Android 5.0系统之上,内存管理有了很大改进,OOM
的情况减少了不少。
Android
的内存资源是十分有限的,加载图片的时候经常会 出现OOM
的情况,虽然可以采用各种方法去优化内存的使用,但是却无法再本质上解决内存 资源稀缺的问题。OOM
问题在低端机上问题尤为严重,而Native
层做处理,不去占用Java
虚拟机层宝贵的内存资源。Fresco
将图片当道一个叫Ashmem
的区域,这样由于图片不占用Java
虚拟机的资源,所以大大减少了OOM
。
内存开销对比 Glide
可以看到 Java heap 基本为 Glide 的一倍, 但是 max native heap
接近 Glide 的十倍。
- Java Heap是对于Java 虚拟机而说的,一般的大小上限是 16M 24M 48M 76M 具体视手机而定。
- Native Heap是对于C/C++直接操纵的系统堆内存,所以它的上限一般是具体RAM的2/3左右。
- 所以对于2G的手机而言,Java Heap 大概76M,而Native Heap是760M左右,相差10倍。
小结
优点
- 最大的优势在于5.0以下(最低2.3)的bitmap加载。在5.0以下系统,Fresco将图片放到一个特别的内存区域(Ashmem区)
- 大大减少OOM(在更底层的Native层对OOM进行处理,图片将不再占用App的内存)
- 适用于需要高性能加载大量图片的场景
缺点
- 包较大(2~3M)
- 用法复杂
- 底层涉及c++领域,阅读源码深入学习难度大