在UIImageView中更快地加载大图像



是否有一种可接受或更新的方法可以更快地将图像加载到UIImageView中?

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

加载图像后,通常可以来回滚动,视觉速度约为60fps。但在第一次加载时,他们总是紧张不安。但如果我把图像做得更小,比如800x800,那么它们加载得很快,我看不到滚动时的抖动。所以我正在处理一个图像大小与绘图速度的问题。5s和iPhone X上出现的问题相同。

[UIImage imageNamed:imageName][UIImage imageWithContentsOfFile:imagePath]也会出现相同的性能打击

我正在阅读UIImages在实际绘制之前是如何解压缩的,如果系统必须绘制子采样图像,它会显著影响主线程的性能。我做了一些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

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

不错,但

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

最新更新