yeatse / KingfisherWebP

Elegantly handle WebP format with Kingfisher.
MIT License
301 stars 71 forks source link

iOS 13 Image Cache Type: Memory - Flickering Issue with All WebPImage #77

Closed make1a closed 8 months ago

make1a commented 8 months ago
            KingfisherManager.shared.defaultOptions += [
                .processor(WebPProcessor.default),
                .cacheSerializer(WebPSerializer.default)
            ]

https://github.com/onevcat/Kingfisher/issues/2188#issuecomment-1878283257

make1a commented 8 months ago

准确的说我注释掉这个代码后,所有的图片都不会有闪的情况了,包括webP和非webP 都不再闪:

          KingfisherManager.shared.defaultOptions += [
                .processor(WebPProcessor.default),
                .cacheSerializer(WebPSerializer.default)
            ]

所以我认为iOS13+iphone8 多次重复设置图片,会闪的问题来源于这里。

make1a commented 8 months ago

@yeatse

make1a commented 8 months ago

我做了一个可以重现的demo。 不停点击item 即可: https://github.com/onevcat/Kingfisher/files/13840999/LaunchAPP.zip

yeatse commented 8 months ago

本地复现了一下 demo,设置 ImageCache.default.memoryStorage.config.totalCostLimit = 1 可以复现你的问题。

闪的原因是 reloadData 的时候触发 imageView.kf.setImage,默认会把 UIImageView 当前内容置空,然后重新加载图片;

低端机内存不足,导致图片库跳过 memoryStorage,重新从磁盘读取解析图片;又由于低端机性能不足,webp 解码较为耗时,在解码过程中 UIImageView 是空白状态,导致看上去“闪了一下”。

解法是增加 .keepCurrentImageWhileLoading 选项,让 imageView.kf.setImage 不再置空当前图片即可。

make1a commented 8 months ago

我测试过增加 .keepCurrentImageWhileLoading ,或者 设置placeholder = imageview.image , 在重复刷新下还是会闪的很厉害。 同时还有一个问题 webP和非webP都会闪。 有其他解决方案吗?感激不尽

yeatse commented 8 months ago

闪的原因我上面已经说过了,options 不生效的原因你可以按照这个思路断点查下;另外还有一个可能是你的 cell 没有复用,可以尝试定位下。

如果找不到原因的话尝试去 WebPSerializer 去掉试试,还是不行的话我也没办法了,直接别用 webp 了

make1a commented 8 months ago

最终只能在底层兼容两套图片库了, iOS13 走sdwebImage , iOS14 走kingfisher, 等项目升级到最低支持iOS14 再删掉SD。