Fresco内存机制学习

仅为自己学习归纳

Image Pipeline


Fresco内存机制学习_第1张图片
Fresco官方缓存图示
大致流程如下:
  1. 寻找内存缓存(Bitmap Cache)中是否有图片,有着返回,无则继续寻找。
  2. 后台线程开始工作。
  3. 寻找未解码缓存中是否有图片,如有,解码,变换,返回。然后将其缓存在内存缓存中。
  4. 寻找磁盘缓存中是否有图片,如有,解码,变换,返回。然后将其缓存到未解码缓存和内存缓存中。
  5. 从网络和本地加载图片,加载后解码,变换,返回。然后将其缓存到各个缓存中去。

上图中,disk cache实际包含了未解码的内存缓存在内,统一在一起只是为了逻辑稍微清楚一些。

关于disk cache的官方解释:

Yes, we know phones don’t have disks, but it’s too tedious to keep saying local storage cache

Fresco内存机制学习_第2张图片
理解缓存图示
Image Pipeline默认有3个线程池:
  1. 3个线程用于网络下载。
  2. 2个线程用于磁盘操作:本地文件的读取,磁盘缓存的操作。
  3. 2个线程用于CPU相关的操作:解码,变换,以及后出来等后台操作。

三级缓存


1.Bitmap缓存

Bitmap缓存储存Bitmap对象,这些Bitmap对象可以立刻用来显示或者用于后处理

在5.0以下系统,BItmap缓存位于ashmem,这样Bitmap对象的创建和释放将不会一发GC(Gabage Collection),更少的GC会使APP更加流畅。

5.0及其以上系统,内存管理有了很大的改进,所以Bitmap缓存直接位于Jav啊的heap(堆内存)上

当应用在后台运行时,该内存会被清空。

ashmem:匿名共享内存

未解码图片的内存缓存

这个缓存存储的时原始压缩格式的图片。从该缓存取到的图片在使用之前,需要先进行解码。

如果有调整大小,旋转,或者WebP编码工作需要完成,这些工作会在解码之前进行。

磁盘缓存

和未解码的内存缓存相似,磁盘缓存储存的时未解码的原始压缩格式的图片,在使用之前同样需要解码等处理。

和其他的不一样,磁盘缓存在后台时,不会被清空,即使设备关闭,不过用户可以随时进入系统菜单进行清空缓存操作。

你可能感兴趣的:(Fresco内存机制学习)