抖音 Android 端图片优化实践
内容提要
本文介绍了抖音Android端图片优化实践,通过使用BDFresco图片框架,优化了内存缓存、图片解码、磁盘缓存和网络加载等方面,提升了图片加载速度和性能,降低了图片成本。采用heic格式、按需缩放和OOM兜底等策略,进一步提升了用户体验。该优化实践已在抖音上取得显著成效。
延伸解读
内存缓存优化的权衡与取舍
抖音在内存缓存优化中,曾尝试将缓存大小翻倍以减少解码,但实验显示OOM减少的同时,native崩溃和ANR显著劣化。这表明单纯增大缓存并非良策,需平衡内存水位与稳定性。最终通过动静图缓存拆分,在不增加单块缓存大小的前提下,提升了整体命中率,降低了OOM,并带来日活和帧率收益。这一过程说明,缓存优化需结合设备内存特性和业务场景,避免盲目扩容。
解码格式选择与透明通道处理
抖音根据设备性能和解码需求,低端机默认使用RGB_565以减少内存占用。对于不携带透明通道的图片(如heic),即使业务指定ARGB_8888,也会在解码阶段强制降级为RGB_565,节省近一半内存。但需注意,圆角、高斯模糊等依赖透明通道的操作可能受影响,因此需对相关业务加白处理。这种精细化的格式选择,在保证功能的前提下有效降低了内存压力。
heif动图独立缓存的设计考量
heif动图因帧间压缩(I帧/P帧)必须顺序解码,且原有调度器在主线程解码导致帧率下降。抖音借鉴iOS思路,为heif动图开辟独立内存缓存,对Bitmap强引用,避免被LRU替换,同时关联View的detach方法主动释放不可见资源。该方案在取得带宽收益的同时,避免了帧率劣化,但需注意强引用可能导致内存增长,因此释放时机的设计至关重要。
按需缩放与CDN缓存协同
抖音发现超过15%的图片存在尺寸浪费,导致解码内存和带宽消耗。通过按需缩放,将图片尺寸收敛至控件大小,不仅减少了解码内存,还提升了veImageX-CDN缓存命中率,降低回源请求。以视觉搜索场景为例,文件大小减少83.39%,内存减少66.57%,CDN命中率提升6.99%。这表明,客户端与CDN协同优化,能同时降低带宽成本和提升加载速度。
Q&A
抖音为什么要优化图片加载能力?
抖音优化图片加载能力是为了降低带宽成本、提升用户浏览体验,并在保证图片质量的前提下加快加载速度。
BDFresco是什么?
BDFresco是字节自研的Android图片框架,提供网络加载、解码和图片处理等功能,旨在提升图片加载效率。
抖音在图片加载过程中采取了哪些优化策略?
抖音在图片加载过程中进行了内存缓存、解码、磁盘缓存和网络加载等方面的优化,提升了加载速度和性能。
如何通过内存缓存优化提升图片加载效率?
通过提高内存缓存的命中率,减少解码和内存申请,合理配置内存缓存,可以有效提升图片加载效率。
抖音如何处理图片解码过程中的内存占用问题?
抖音通过使用不同的解码格式和优化解码流程,减少内存占用,特别是对不需要透明通道的图片进行格式降级。
抖音的网络加载优化有哪些具体措施?
抖音通过使用heic格式、按需缩放和优化网络加载流程,减少带宽消耗和加载时间,提升用户体验。