by

Where communities thrive


  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
People
Activity
  • 11:09
    kinarobin closed #3054
  • 05:25
    arslan311 edited #3059
  • 05:22
    arslan311 opened #3059
  • Aug 02 09:34
    mahadshahib opened #3058
  • Aug 01 08:26
    stale[bot] labeled #2928
  • Aug 01 08:26
    stale[bot] labeled #3022
  • Jul 31 10:35
    yyhinbeijing edited #3056
  • Jul 31 03:41
    yyhinbeijing edited #3057
  • Jul 31 03:41
    yyhinbeijing edited #3057
  • Jul 31 03:40
    yyhinbeijing edited #3057
  • Jul 31 03:40
    yyhinbeijing edited #3057
  • Jul 31 03:39
    yyhinbeijing opened #3057
  • Jul 31 03:05
    yyhinbeijing edited #3056
  • Jul 29 09:51
    yyhinbeijing edited #3056
  • Jul 29 09:48
    yyhinbeijing opened #3056
  • Jul 29 09:00
    dreampiggy unlabeled #2963
  • Jul 29 05:09
    stale[bot] labeled #2963
  • Jul 25 16:20
    dreampiggy labeled #3055
  • Jul 25 16:20
    dreampiggy labeled #3055
  • Jul 25 16:20
    dreampiggy closed #3055
DreamPiggy
@dreampiggy
正常的应该是SDAnimatedImage对象
Lee0820
@Lee0820
查了几个gif,有的单个gif可能会有几十张,甚至80个
一下子加载会 涨到1.5G左右的内存
DreamPiggy
@dreampiggy
SDAnimatedImageView边解码边渲染,内存总大小是固定的,肯定是你用UIAnimatedImage加载了
或者你难道用了preloadAllFrames?
Lee0820
@Lee0820
我这目前仅仅用了SDAnimatedImageView的这个方法 - (void)sd_setImageWithURL:(nullable NSURL *)url NS_REFINED_FOR_SWIFT;
DreamPiggy
@dreampiggy
我意思其他地方,UIImageView提前帮你渲染了
要“全App缓存中”无任何UIAnimatedImage。你用那个OptionsProcessor代码贴进去再试一次。感觉你好像压根没实验
DreamPiggy
@dreampiggy
自己用iPhone真机测试,把你贴的所有URL放到List中加载,iPhone XR占用内存在750MB,属于符合预期的值(按照那个默认规则计算,free为1.5GB,total为3GB)
截屏2020-05-25下午3.38.52.png
你说的会Crash是什么状况?
Lee0820
@Lee0820
好的,我查一下,之前的crash,就是在7p上,内存达到1.5G后,就被系统杀死了,提示gif Message from debugger: Terminated due to memory
DreamPiggy
@dreampiggy
之前的Crash用的版本,是SD 5.8.0?使用了UIImageView?
Lee0820
@Lee0820
是的,我刚在一个demo里改成SDAnimatedImageView 在测试
DreamPiggy
@dreampiggy
按照我那个MR回复,建议的优化,是禁止UIImageView加载动图,只针对SDAnimatedImageView加载动图;如果有特别大图的case下发场景,你可以自行修改所有地方用到的maxBufferSize,让它可控
Lee0820
@Lee0820
52E0CDDF-6C24-493E-ADEF-5B246928B3FE.png
我现在加了
SDWebImageManager.sharedManager.optionsProcessor = [SDWebImageOptionsProcessor optionsProcessorWithBlock:^SDWebImageOptionsResult _Nullable(NSURL _Nullable url, SDWebImageOptions options, SDWebImageContext * _Nullable context) {
// Check SDAnimatedImageView
if (!context[SDWebImageContextAnimatedImageClass]) {
options |= SDWebImageDecodeFirstFrameOnly;
}
return [[SDWebImageOptionsResult alloc] initWithOptions:options context:context];
}];
内存大概在700--1.8G之间循环跳动
DreamPiggy
@dreampiggy
看起来每次波峰是因为打到OOM阈值了被自动clear掉历史的frames了
不过,有问题啊,你的Example还是project,为什么和我行为不一样?我这里不会一直涨呀,你加载了多少图
感觉你这里的数量应该是给我发的URL的倍数
看起来你这个像是一个SDK App,开源的吗,能共享出来直接Debug下不
Lee0820
@Lee0820
可以的,我发你邮箱 ~
Lee0820
@Lee0820
已经发了
Lee0820
@Lee0820
你好,maxBufferSize参数的作用我没太看懂,0表示通过计算当前内存使用量自动调整。
1意味着没有任何缓冲缓存,每个帧将被解码,然后16m在渲染后释放。(最低内存和最高CPU),设置成1,大概只有160M左右 ~,能简单解释下吗,感谢
DreamPiggy
@dreampiggy
拿CPU换时间呀
每帧都要解码,CPU占用率高
解码渲染后立即销毁,内存释放。不过动图频率高了或者解码慢,就会lag
Lee0820
@Lee0820
昨天那个demo,一直涨的问题您这边有debug吗 ~
DreamPiggy
@dreampiggy
我今天或明天抽空看一下,有Full Time Job有时会忙
Lee0820
@Lee0820
好的,辛苦了,感谢
DreamPiggy
@dreampiggy
这样吧,这个问题有一个优化点,就是目前各个SDAnimatedImageView都是独立的,Player也是独立的,各自有一个frame cache limit,但是总数可能会很高,导致频繁触发DidReceiveMemoryWarning。虽然理论上不会Crash(因为一旦触发立即销毁了,这个销毁是block main queue同步进行的而非异步)。但是按照你的意思想更精确控制消耗
可能需要对全局的Player的内存占用做一个管理,或者更激进的,对所有通过SDImageCodersManager的触发解码/编码的调用,做内存管理
一直以来忘记这个事情了
Lee0820
@Lee0820
具体现在怎么操作,通过设置 SDAnimatedImageView 的 maxBufferSize来处理吗?
Lee0820
@Lee0820
目前有当 SDAnimatedImageView 销毁的时候能情况它图片占用的内存吗?
DreamPiggy
@dreampiggy
frame cache是SDAnimatedImageView的一个属性,字典,当然销毁……
除非你在Decoder级别做了缓存,有一个叫做preloadAllFrames的options,看那个说明
额,5.7以后是SDAnimatedImagePlayer,其实代码就是移动过去的
Lee0820
@Lee0820
目前用SDAnimatedImageView加载gif,设置了maxBufferSize还是内存暴涨,我看SDAnimatedImageView delloc方法执行了,但是内存没释放 ~
DreamPiggy
@dreampiggy
那就说明这个内存不是帧缓存占据的内存
帧缓存是绑定到ImageView上的,不是SDAnimatedImage上,也不会存入SDImageCache,对吧
xiaoxiaoyingqian
@xiaoxiaoyingqian
9A95F0C8-E549-4561-9D45-F545DE013B3E.png
发现5.x版本一个崩溃,出现概率较高
DreamPiggy
@dreampiggy
按照模版发一下场景,iOS版本,Xcode版本,SDWebImage版本,机型,复现概率
看堆栈像是系统ImageIO库线程不安全?
xiaoxiaoyingqian
@xiaoxiaoyingqian

Issue Info

Info Value
Platform Name ios
Platform Version 13.1.3
SDWebImage Version e.g. 5.0.0 / 4.4.0
Integration Method cocoapods
Xcode Version Xcode 11.3.1
Repro rate unknown
Repro with our demo prj
Demo project link
我们最近准备从4.x切换到5.x,然后我这边直接真机联调截断就发现了3次左右这种情况,我怀疑是ImageIO库非线程安全的问题,但是好像查了下,这个api有说是线程安全的
DreamPiggy
@dreampiggy
具体SDWebImage的版本号
DreamPiggy
@dreampiggy
不清楚是不是有一些内部机制修改。这里的CGImageSourceCreateImageAtIndex,先手动会本地构造的NSMutableDictionary进行一次copy操作吧(之前测试是无所谓的)。