要优化首先要了解gif的特性,已经glide如何渲染gif的。由于源码的剖析过程非常长,都可以单独出个文章了。这里只说下要点:
- gif特性:
-
gif文件的文件头前3个字节必然为 ‘G’ ‘I’ ‘F’
-
gif中的每一帧尺寸相同
-
gif中每帧会有间隔时间
- glide支持:
-
ImageHeaderParserUtils.getType
检测资源是否为gif -
com.bumptech.glide.load.resource.gif.GifDrawable
为最终渲染gif的drawable -
StreamGifDecoder 和 ByteBufferGifDecoder
把流转换为GifDrawable
-
GifDrawableEncoder
把GifDrawable
转换为File
-
以上组件模块在
com.bumptech.glide.Glide
的构造方法内进行注册组装
优化的技术选型
- 优化解析速度提升效率,使用giflib替换glide的java解析代码提升效率
例如:giflib、android-gif-drawable
- 缓冲渲染,2个Bitmap容器轮流进入子线程解析填充,之后在主线程渲染
根据上机实际表现android-gif-drawable
,内存占用和Cpu占用率最好,而且提供了pl.droidsonroids.gif.GifDrawable
并且拥有解析和序列化的api,而且作者在持续维护,后期bug修复和项目其他需求支持均可以兼顾,选择此第三方库为gif解析和渲染核心。
融合glide
glide的gif之前前面已经分析出来,我们只需要照猫画虎实现对应接口和类即可,copy修改开始,创建如下这些类
GifLibDecoder 解析io InputStream 实际是获取byte[]交给下面的解析器
GifLibByteBufferDecoder 解析 byte[]生成 GifDrawable的 包装 GifLibDrawableResource
GifLibDrawableResource 封装GifDrawable提供销毁和内存占用大小计算(用于lrucache)
DrawableBytesTranscoder和GifLibBytesTranscoder 用于转换
GifLibEncoder 用于序列化成文件
重要的解析类: