作者:一只修仙的猿
最近回归android业务开发,开发了如下图的视频剪辑时间轴(图源:剪映):
对于时间轴上的缩略图,需要去解码器加载获取。若每次都去解码器获取,会导致缩略图加载卡顿,无法满足性能需求,因此这里需要对缩略图进行缓存来提高加载效率。那么其中的缓存策略,就是一个值得我们思考的关键点。
这篇文章来介绍这个缩略图缓存的思考与设计的过程,希望能够对你有所帮助。
背景
视频时间轴,我使用的是RecyclerView来实现,其中,每个Item为一个ImageView,即一个缩略图。如下图所示:
缩略图使用时间戳在解码器中进行定位获取。例如一个10s的视频,需要显示10个缩略图,则每个缩略图对应的视频时间位置是0s、1s、2s…9s。
缩略图加载的时机是:
- 当我们滑动时间轴时,一个item从不可见到可见,该item的
onBindViewHolder()
方法会被调用,则对应时间的缩略图会被加载一次。 - 当我们调用RecyclerView的
notifyDataChanged()
时,屏幕上显示的所有缩略图,都会被重新加载一次。
在我们的项目中,缩略图解码器的性能比较差。举个例子,一个缩略图的加载耗时,可能是1s。假如我们不使用缓存,那么我们每次滑动到一个新的位置,都需要等待好几秒,缩略图才能完全显示完毕,这个体验是非常差的。
优化的方法,其中最直接的,是降低获取缩略图接口的耗时,例如从1s降低到0.1s,但这个优