【问题标题】:Loading large images faster in UIImageView在 UIImageView 中更快地加载大图像
【发布时间】:2019-01-03 12:34:12
【问题描述】:

是否有一种公认的方式或更新的方式可以更快地将图像加载到 UIImageView 中?

我的场景:一个集合视图,带有一个大的 UIImageView。一次只显示 1 个单元格。我已经在集合视图上实现了 NSCache 和 Prefetching。滚动性能在中途暂停。我使用的图像“相对”大,以适应 iPad 和 iPhone 布局。例如,图像为 1600x1600px、RGB、PNG。 (从 2-5MB 压缩,~10MB 未压缩,本地存储在应用程序中)

加载图像后,来回滚动通常就可以了,视觉上约为 60fps。但在首次加载时,它们总是很紧张。但是,如果我使图像在物理上更小,例如 800x800,那么它们会快速加载并且我看不到滚动时的抖动。所以我正在处理图像大小与绘图速度的问题。 5s 上和 iPhone X 上出现的问题相同。

[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

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

【问题讨论】:

  • 通过将大 PNG 图像更改为 JPG,此问题已解决或没有实际意义;加载速度很快/很好,没有其他代码更改。

标签: ios objective-c uiimageview uiimage


【解决方案1】:

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

不错,但是

  • (1) 你不应该 NSCache 图像
  • (2) 您应该将图像缩小到显示所需的最大尺寸
  • (3) 你不应该在 itemForRowAt: 中做任何耗时的事情(你没有展示你的)——你只有几毫秒的时间来生产细胞并离开
  • (4)如果不能及时提供图片,提供占位符,退出itemForRowAt:;当您拥有真实图像时,您可以随时重新加载
  • (5)在主线程之外完成所有耗时的工作(包括转换为 UIImage 和绘制 UIImage 以缩小它)
  • (6)测测测测!这就是我们有 Instruments 的原因;不要猜测问题出在哪里

【讨论】:

  • 所有这些都在 Stack Overflow 以及大量的 WWDC 视频等上进行了大量讨论。现有技术非常明确;你应该使用它。
  • 我还应该提到预取的一个主要错误:它可能恰好在您尝试准备第一个单元格时发生,这会减慢您的速度。该错误已在 iOS 12 中修复。同样,有一个非常好的 WWDC 视频。
  • 好奇为什么不使用图像缓存?保存从磁盘重新加载。顺便说一句,[UIImage imageNamed:img] 在 ViewController 关闭后不会释放内存,所以我正在使用 imageWithContentsOfFile 并且我不想一直从磁盘重新加载。
  • 苹果对此一直很清楚。例如,参见 WWDC 2011 视频 318 分钟 24。已显示的 UIImage 由整个解码位图组成;这是巨大的。同样,使用 Instruments (Allocations) 来查看您正在做的事情的效果。正如我所说,您应该尽可能早地观看相关的 WWDC 视频(名称中包含 Performance 或 Memory,以及 Image Best Practices 等)。
  • 今年 WWDC 的一个会议涵盖了图像下采样。 developer.apple.com/videos/play/wwdc2018/219
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-02
  • 2019-09-04
  • 1970-01-01
相关资源
最近更新 更多