在UIImageView中更快地加载大图像

时间:2018-07-26 13:30:23

标签: ios objective-c uiimageview uiimage

是否有一种接受的方式或更新的方式可以更快地将图像加载到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

1 个答案:

答案 0 :(得分:4)

  

我已经在集合视图上实现了NSCache和Prefetching。

很好,但是

  • (1)您不应使用NSCache映像
  • (2)您应将图像缩小到 display
  • 所需的最大尺寸
  • (3)您不应该在itemForRowAt:中做任何耗时的事情(您没有展示自己的东西)-您只有几毫秒的时间来生产细胞并离开
  • (4)如果无法及时提供图像,请提供占位符并退出itemForRowAt:;您可以在拥有真实图像后随时重新加载
  • (5)在主线程上完成所有耗时的工作(包括转换为UIImage并绘制UIImage以缩小尺寸)
  • (6)措施措施措施!这就是我们拥有乐器的原因;不要猜测问题出在哪里