一、内存复用:BitmapPool的精妙设计
Bitmap 的内存分配是 Android 性能优化的核心挑战。Glide 通过 BitmapPool,将已释放的 Bitmap 缓存起来,以供后续复用,从而显著减少了内存抖动和 GC 压力。
1. LruBitmapPool的核心策略
LruBitmapPool是BitmapPool的默认实现,它基于 LRU(最近最少使用)策略管理缓存。SizeConfigStrategy:LruBitmapPool内部使用SizeConfigStrategy来管理 Bitmap 的复用。它将 Bitmap 按尺寸和**配置(Config)**分组,从而实现高效的匹配和查找。
2. 复用条件与流程
- Android 4.4+ :
inBitmap的复用条件放宽。Glide 会从BitmapPool中获取一个尺寸大于等于请求尺寸的 Bitmap 进行复用。 - 回收流程:当一个
Bitmap不再被引用时,Glide 会将其放回LruBitmapPool。LruBitmapPool会检查其大小和配置,然后将其存入对应的分组中。
二、图片解码的智能优化
Glide 在解码时,会综合考虑图片来源、ImageView 尺寸和设备配置,以最节省内存的方式进行解码。
1. 智能采样(Downsampling)
Downsampler是 Glide 的核心解码器。它会首先计算出最合适的inSampleSize,从而避免加载过大的原始图片。Downsampler随后将inSampleSize参数传入BitmapFactory.decodeStream(),以解码出与ImageView尺寸匹配的Bitmap。
2. 自动选择解码格式
Bitmap.Config:Glide 会根据图像是否包含透明通道,自动选择最节省内存的解码格式。RGB_565:对于不含透明通道的图片(如 JPEG),Glide 会优先使用RGB_565格式,这能将内存占用减少 50%。ARGB_8888:对于含透明通道的图片(如 PNG),则使用ARGB_8888。
三、硬件加速与多级缓存
1. 硬件加速
Bitmap.Config.HARDWARE:Android 8.0+ 引入的硬件Bitmap,其内存分配在 GPU 内存中,减少了内存占用和 GPU 上传时间。- 局限性:
HARDWARE配置的Bitmap是不可修改的。任何对它的修改操作都会抛出异常。
2. 多级缓存
- 活动资源(
ActiveResources) :缓存当前正在使用的Bitmap。它通过WeakReference监控Bitmap的引用,一旦Bitmap被释放,就会将其从活动资源中移除。 - 内存缓存(
Memory Cache) :缓存最近释放的Bitmap,使用 LRU 策略。 - 磁盘缓存(
Disk Cache) :缓存原始图片数据或转换后的结果,避免重复的网络请求和解码。