Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

gif加载性能 #125

Open
Lieeber opened this issue Nov 10, 2021 · 26 comments
Open

gif加载性能 #125

Lieeber opened this issue Nov 10, 2021 · 26 comments
Labels
enhancement New feature or request

Comments

@Lieeber
Copy link

Lieeber commented Nov 10, 2021

你好,我有一个疑问,glide默认有gif加载功能,该库提供的gif加载方式相比glide默认的gif加载有性能上的优势吗?

@jingpeng
Copy link
Collaborator

glide gif解析是在java层,本库gif解析转到native侧,native会比java侧在数据处理上有性能优势

@penfeizhou
Copy link
Owner

penfeizhou commented Nov 11, 2021

我再补充一些:
Glide默认支持Gif解析,但在实际中,发现,当列表中有大量Gif同时播放时,低端的手机很容易会出现卡顿的情况,CPU占用很高.
该库对LZW解压数据这一步进行优化,使用C++代码重新实现了LZW解压算法,并进行了局部优化.性能上是要比原生Glide强的.
当然该库的三个解码器都可以进行逐个控制开启或关闭(APNG,WebP,Gif)
如下代码会禁用该库的Gif解码器(不推荐)

GlideApp.with(imageView)
                    .load(url)
                    .set(AnimationDecoderOption.DISABLE_ANIMATION_GIF_DECODER, true)
                    .into(imageView);

@Lieeber
Copy link
Author

Lieeber commented Nov 11, 2021

虽然解析gif放到了native层,但是我在实际测试中发现性能比glide自带的还要差,会不会与gifframe处理过程中把数据通过canvas绘制到bitmap,再又将bitmap的数据倒腾到framebuffer中,真正绘制的时候,会再次将数据生成到bitmap有关。

@jingpeng
Copy link
Collaborator

实际测试是怎么测试的呢

@Lieeber
Copy link
Author

Lieeber commented Nov 11, 2021

用的android studio的 profile工具

@jingpeng
Copy link
Collaborator

这个是使用本库加载gif的性能图CPU部分
截屏2021-11-11 下午1 05 02

这个是默认glide加载同一张gif的的性能图CPU部分
截屏2021-11-11 下午1 06 16

@jingpeng
Copy link
Collaborator

使用本库加载同一个图CPU会降低

@jingpeng
Copy link
Collaborator

这个是使用本库加载gif的性能图内存部分
截屏2021-11-11 下午1 12 58
这个是默认glide加载同一张gif的的性能图内存部分
截屏2021-11-11 下午1 11 34

内存消耗本库略微低一点

@jingpeng
Copy link
Collaborator

jingpeng commented Nov 11, 2021

world-cup
使用的是这个gif,43k大小,内存本库会节约几M

@penfeizhou
Copy link
Owner

用的android studio的 profile工具

能否提供更明确的截图信息和测试方法,这个结论跟我之前测试的结果不符

@penfeizhou
Copy link
Owner

虽然解析gif放到了native层,但是我在实际测试中发现性能比glide自带的还要差,会不会与gifframe处理过程中把数据通过canvas绘制到bitmap,再又将bitmap的数据倒腾到framebuffer中,真正绘制的时候,会再次将数据生成到bitmap有关。

对于数据的传输,是一个拷贝过程,相对于图片解码整个流程来说影响较小

@penfeizhou
Copy link
Owner

world-cup 使用的是这个gif,43k大小,内存本库会节约几M

对于更大或更多的Gif,效果会更明显

@Lieeber
Copy link
Author

Lieeber commented Nov 11, 2021

Screenshot_20211111-145302

@jingpeng
Copy link
Collaborator

jingpeng commented Nov 11, 2021

先对比下一张图?控制变量

@Lieeber
Copy link
Author

Lieeber commented Nov 11, 2021

一张图cpu和内存差别不太大。用小图区别更加不明显。

@penfeizhou
Copy link
Owner

稍等,我来复现一下你的测试结果.

@jingpeng
Copy link
Collaborator

ok稍后我看下

@Lieeber
Copy link
Author

Lieeber commented Nov 11, 2021

好的 辛苦

@penfeizhou
Copy link
Owner

在图片较大时,因为数据较大导致native层需要分批调用Reader接口从Java层拿数据,导致JNI调用次数急剧攀升,用于测试的图片每一帧都有数千次JNI的调用,JNI开销导致整体方法性能迅速劣化.
目前建议该情况先通过设置AnimationDecoderOption.DISABLE_ANIMATION_GIF_DECODER避免该情况.
我会继续跟进,感谢反馈该问题.

@penfeizhou penfeizhou added the enhancement New feature or request label Nov 11, 2021
@Lieeber
Copy link
Author

Lieeber commented Nov 12, 2021

好的 谢谢。

@GuoLiangjun123
Copy link

我再补充一些: Glide默认支持Gif解析,但在实际中,发现,当列表中有大量Gif同时播放时,低端的手机很容易会出现卡顿的情况,CPU占用很高. 该库对LZW解压数据这一步进行优化,使用C++代码重新实现了LZW解压算法,并进行了局部优化.性能上是要比原生Glide强的. 当然该库的三个解码器都可以进行逐个控制开启或关闭(APNG,WebP,Gif) 如下代码会禁用该库的Gif解码器(不推荐)

GlideApp.with(imageView)
                    .load(url)
                    .set(AnimationDecoderOption.DISABLE_ANIMATION_GIF_DECODER, true)
                    .into(imageView);

你们只是把解析放在了native层,但是当gif解析成一张张的bitmap后,这些bitmap的解析并没有放在native层。

@penfeizhou
Copy link
Owner

我再补充一些: Glide默认支持Gif解析,但在实际中,发现,当列表中有大量Gif同时播放时,低端的手机很容易会出现卡顿的情况,CPU占用很高. 该库对LZW解压数据这一步进行优化,使用C++代码重新实现了LZW解压算法,并进行了局部优化.性能上是要比原生Glide强的. 当然该库的三个解码器都可以进行逐个控制开启或关闭(APNG,WebP,Gif) 如下代码会禁用该库的Gif解码器(不推荐)

GlideApp.with(imageView)
                    .load(url)
                    .set(AnimationDecoderOption.DISABLE_ANIMATION_GIF_DECODER, true)
                    .into(imageView);

你们只是把解析放在了native层,但是当gif解析成一张张的bitmap后,这些bitmap的解析并没有放在native层。

不明白你说的bitmap的解析是什么东西, bitmap就是像素点的集合,不需要什么解析,这也不是性能的瓶颈点

@GuoLiangjun123
Copy link

我再补充一些: Glide默认支持Gif解析,但在实际中,发现,当列表中有大量Gif同时播放时,低端的手机很容易会出现卡顿的情况,CPU占用很高. 该库对LZW解压数据这一步进行优化,使用C++代码重新实现了LZW解压算法,并进行了局部优化.性能上是要比原生Glide强的. 当然该库的三个解码器都可以进行逐个控制开启或关闭(APNG,WebP,Gif) 如下代码会禁用该库的Gif解码器(不推荐)

GlideApp.with(imageView)
                    .load(url)
                    .set(AnimationDecoderOption.DISABLE_ANIMATION_GIF_DECODER, true)
                    .into(imageView);

你们只是把解析放在了native层,但是当gif解析成一张张的bitmap后,这些bitmap的解析并没有放在native层。

不明白你说的bitmap的解析是什么东西, bitmap就是像素点的集合,不需要什么解析,这也不是性能的瓶颈点

gif是被解析成一张张的bitmap绘制在屏幕上的,解析这些bitmap的时候你们是放在哪解析的,还是说你们用的giflib?

@HolinB
Copy link

HolinB commented Feb 16, 2023

Glide默认支持gif开销最大的不是在解析的过程,而是在生成一张张bitmap,而且在ImageView在显示一张bitmap的同时已经生成了下一张bitmap放在内存里,所以glide默认的gif加载内存才会居高不下

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

5 participants