【发布时间】: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