Android开发——优化Glide加载超大gif图,面试经历分享

How


要优化首先要了解gif的特性,已经glide如何渲染gif的。由于源码的剖析过程非常长,都可以单独出个文章了。这里只说下要点:

  • gif特性:
  1. gif文件的文件头前3个字节必然为 ‘G’ ‘I’ ‘F’

  2. gif中的每一帧尺寸相同

  3. gif中每帧会有间隔时间

  • glide支持:
  1. ImageHeaderParserUtils.getType 检测资源是否为gif

  2. com.bumptech.glide.load.resource.gif.GifDrawable 为最终渲染gif的drawable

  3. StreamGifDecoder 和 ByteBufferGifDecoder 把流转换为GifDrawable

  4. GifDrawableEncoderGifDrawable转换为File

  5. 以上组件模块在com.bumptech.glide.Glide的构造方法内进行注册组装

优化的技术选型

  1. 优化解析速度提升效率,使用giflib替换glide的java解析代码提升效率

例如:giflibandroid-gif-drawable

  1. 缓冲渲染,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 用于序列化成文件

重要的解析类:

  • 12
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值