Fresco-Source-Analysis
Fresco-Source-Analysis copied to clipboard
关于Fresco缓存的疑问
你好,最近我也在看Fresco的东西,有一个地方一直没想通,想请教一下:Fresco为什么要将未解码的数据放到内存缓存中,而不是全部放到磁盘数据里,EncodedMemoryCache的作用到底是什么呢?
@wangsai-silence 这个问题很好。其实我也不是很能确定它的用意,我个人认为EncodedMemoryCache
存在的意义主要是减少读取、查找本地缓存的时间。原因是:
- 本地缓存
DiskCacheProducer.produceResults()
中通过BufferedDiskCache.get()
开启线程读取本地内容,如果有EncodedMemoryCache
这一层的存在的话,本地读取成功就会存到内存中,这个读取速度会比本地缓存快很多。 - 两个内存缓存,未解码缓存池
DefaultEncodedMemoryCacheParamsSupplier
与已解码缓存池DefaultBitmapMemoryCacheParamsSupplier
进行对比。两者存储能力、特点都不同,举几个简单例子:- 未解码缓存池至少可以存8个item,已解码缓存池可能一个item就占满了;
- 未解码缓存池最多能够存
Integer.MAX_VALUE
个item,已解码缓存池最多只能有256个item; -
EncodedImage
存储的是字节码、图像的尺寸与缩放信息,其大小远比解码后的Bitmap
小(至少是10倍差距)
当已解码缓存池用尽后,未解码的缓存池很可能还有地方存储。加快缓存的读取速度,扩大内存缓存容量,这就是我对它的理解。