Fresco-Source-Analysis icon indicating copy to clipboard operation
Fresco-Source-Analysis copied to clipboard

关于Fresco缓存的疑问

Open wangsai-silence opened this issue 9 years ago • 1 comments

你好,最近我也在看Fresco的东西,有一个地方一直没想通,想请教一下:Fresco为什么要将未解码的数据放到内存缓存中,而不是全部放到磁盘数据里,EncodedMemoryCache的作用到底是什么呢?

wangsai-silence avatar Jan 04 '16 08:01 wangsai-silence

@wangsai-silence 这个问题很好。其实我也不是很能确定它的用意,我个人认为EncodedMemoryCache存在的意义主要是减少读取、查找本地缓存的时间。原因是:

  1. 本地缓存DiskCacheProducer.produceResults()中通过BufferedDiskCache.get()开启线程读取本地内容,如果有EncodedMemoryCache这一层的存在的话,本地读取成功就会存到内存中,这个读取速度会比本地缓存快很多。
  2. 两个内存缓存,未解码缓存池DefaultEncodedMemoryCacheParamsSupplier与已解码缓存池DefaultBitmapMemoryCacheParamsSupplier进行对比。两者存储能力、特点都不同,举几个简单例子:
    • 未解码缓存池至少可以存8个item,已解码缓存池可能一个item就占满了;
    • 未解码缓存池最多能够存Integer.MAX_VALUE个item,已解码缓存池最多只能有256个item;
    • EncodedImage存储的是字节码、图像的尺寸与缩放信息,其大小远比解码后的Bitmap小(至少是10倍差距)

当已解码缓存池用尽后,未解码的缓存池很可能还有地方存储。加快缓存的读取速度,扩大内存缓存容量,这就是我对它的理解。

desmond1121 avatar Jan 04 '16 14:01 desmond1121