有缓存的情况下,前后台切换。YYAnimatedImageView会少播放一遍动画
Reliable-D opened this issue · 3 comments
YYAnimatedImageView会少播放一遍动画
背景:
- 图片格式为gif或apng图片,图片的loopCount为2。
- 图片已经被加载至YYAnimatedImageView中,且已经播放完
- autoPlayAnimatedImage为默认值YES
问题步骤:
- 动图初次播放完毕后,前台切后台。
- 后台切前台,查看是否正在播放,且播放内容多少遍
期望:
- 动画可以正常播放
- 动画播放的遍数是2遍
结果:
- 动画可以正常播放
- 动画只播放了1遍
初步调查结果:
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或者作者能否抽空帮忙看一下。非常感谢!!!
您好,最近我偶尔遇到播放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地址。请问能否指教下如何解决这个问题?
您好,最近我偶尔遇到播放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导致的可能性比较小
应该是我在动画播放时把 YYAnimatedImageView
移除了,现在我在移除前先停止动画播放。