是否有一种接受的方式或更新的方式可以更快地将图像加载到UIImageView中?
我的场景:具有大UIImageView的集合视图。一次仅显示1个单元格。我已经在集合视图上实现了NSCache和Prefetching。滚动性能会暂停一段时间。我正在使用的图像“相对”较大,以便适应iPad和iPhone的布局。例如,图像为1600x1600px,RGB,PNG。 (压缩后的2-5MB,未压缩的约10MB,存储在应用程序本地)
加载图像后,通常可以来回滚动,视觉上约为60fps。但是在首次加载时,它们总是很不稳定。但是,如果我缩小图像的尺寸,例如800x800,则它们会快速加载,并且滚动时看不到抖动。因此,我正在处理图像大小与绘制速度的问题。与iPhone X一样,在5s上出现相同的问题。
[UIImage imageNamed:imageName]
或[UIImage imageWithContentsOfFile:imagePath]
会产生相同的性能影响
我正在阅读UIImage在实际绘制之前如何解压缩,并且如果系统必须绘制子采样的图像,则可能会严重影响主线程的性能。我已经进行了一些Instruments测试,并确认似乎我的代码实际上都不慢,PNG的图像绘制也很慢。
是否有更新的方法来执行与以下链接中的内容类似的操作,即IE 在CGContext中绘制图像并希望其保持缓存状态?
https://www.cocoanetics.com/2011/10/avoiding-image-decompression-sickness/
- (void)decompressImage:(UIImage *)image
{
UIGraphicsBeginImageContext(CGSizeMake(1, 1));
[image drawAtPoint:CGPointZero];
UIGraphicsEndImageContext();
}
https://gist.github.com/steipete/1144242
这对我来说似乎实在是矫kill过正: https://github.com/path/FastImageCache
答案 0 :(得分:4)
我已经在集合视图上实现了NSCache和Prefetching。
很好,但是
itemForRowAt:
中做任何耗时的事情(您没有展示自己的东西)-您只有几毫秒的时间来生产细胞并离开itemForRowAt:
;您可以在拥有真实图像后随时重新加载