Glide深度解析:Bitmap优化与内存管理的底层策略

471 阅读2分钟

一、内存复用:BitmapPool的精妙设计

Bitmap 的内存分配是 Android 性能优化的核心挑战。Glide 通过 BitmapPool,将已释放的 Bitmap 缓存起来,以供后续复用,从而显著减少了内存抖动和 GC 压力。

1. LruBitmapPool的核心策略

  • LruBitmapPoolBitmapPool 的默认实现,它基于 LRU(最近最少使用)策略管理缓存。
  • SizeConfigStrategyLruBitmapPool 内部使用 SizeConfigStrategy 来管理 Bitmap 的复用。它将 Bitmap 按尺寸和**配置(Config)**分组,从而实现高效的匹配和查找。

2. 复用条件与流程

  • Android 4.4+inBitmap 的复用条件放宽。Glide 会从 BitmapPool 中获取一个尺寸大于等于请求尺寸的 Bitmap 进行复用。
  • 回收流程:当一个 Bitmap 不再被引用时,Glide 会将其放回 LruBitmapPoolLruBitmapPool 会检查其大小和配置,然后将其存入对应的分组中。

二、图片解码的智能优化

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 :缓存原始图片数据或转换后的结果,避免重复的网络请求和解码。