在UIImageView中更快地加载大图像

Chr*_*lio 3 objective-c uiimageview uiimage ios

是否有一种接受的方法或更新的方法可以更快地将图像加载到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();
}
Run Code Online (Sandbox Code Playgroud)

https://gist.github.com/steipete/1144242

对我来说这似乎是真正的矫kill过正:https//github.com/path/FastImageCache

mat*_*att 5

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

好,但是

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