ibireme / YYImage

Image framework for iOS to display/encode/decode animated WebP, APNG, GIF, and more.
MIT License
1.76k stars 479 forks source link

有缓存的情况下,前后台切换。YYAnimatedImageView会少播放一遍动画 #125

Open Reliable-D opened 5 years ago

Reliable-D commented 5 years ago

YYAnimatedImageView会少播放一遍动画

背景:

  1. 图片格式为gif或apng图片,图片的loopCount为2。
  2. 图片已经被加载至YYAnimatedImageView中,且已经播放完
  3. autoPlayAnimatedImage为默认值YES

问题步骤:

  1. 动图初次播放完毕后,前台切后台。
  2. 后台切前台,查看是否正在播放,且播放内容多少遍

期望:

  1. 动画可以正常播放
  2. 动画播放的遍数是2遍

结果:

初步调查结果:

YYAnimatedImageView的step:方法有一个_bufferMiss字段用来标记是否有缓存帧。 有nextIndex字段用来标记下一张图的index。当nextIndex为0时,当前的loopCount会加1,具体代码为(_curLoop++; YYAnimatedImageView.m 481 line),通过_curLoop+1最终实现loopCount播放机制

但前后台切换再回到前台。因为之前已播放完毕过,所以_bufferMiss == NO 且 nextIndex == 0。因此,图片刚回到前台进入step:方法,就会进入到_curLoop++;。导致的结果是:loopCount少运行一次,进而产生只播放了一遍动画的问题。


以上是我个人的一些初步的调查。但因项目准备集成YYImage,正在寻找一些work around或者作者能否抽空帮忙看一下。非常感谢!!!

snow-nwh commented 5 years ago

您好,最近我偶尔遇到播放GIF崩溃。崩溃定位到 step: 方法内 LOCK(这行代码,提示 EXC_BAD_ACCESS错误。 LOCK是线程控制的宏

define LOCK(...) dispatch_semaphore_wait(self->_lock, DISPATCH_TIME_FOREVER); \

__VA_ARGS__; \ dispatch_semaphore_signal(self->_lock);

应该是子线程里访问了不存在的image地址。请问能否指教下如何解决这个问题?

Reliable-D commented 5 years ago

您好,最近我偶尔遇到播放GIF崩溃。崩溃定位到 step: 方法内 LOCK(这行代码,提示 EXC_BAD_ACCESS错误。 LOCK是线程控制的宏

define LOCK(...) dispatch_semaphore_wait(self->_lock, DISPATCH_TIME_FOREVER);

VA_ARGS; dispatch_semaphore_signal(self->_lock);

应该是子线程里访问了不存在的image地址。请问能否指教下如何解决这个问题?

图片缓存逻辑是YYImage内部直接处理掉了。野指针的问题是否是外部操作了图片?感觉由YYImage导致的可能性比较小

snow-nwh commented 5 years ago

应该是我在动画播放时把 YYAnimatedImageView 移除了,现在我在移除前先停止动画播放。