gpt4 book ai didi

iphone - CGImage/UIImage 在 UI 线程上延迟加载会导致卡顿

转载 作者:行者123 更新时间:2023-12-03 18:26:21 27 4
gpt4 key购买 nike

我的程序显示一个水平滚动表面,从左到右平铺有 UIImageViews。代码在 UI 线程上运行,以确保新可见的 UIImageView 分配有新加载的 UIImage。加载发生在后台线程上。

一切工作几乎都很好,除了每个图像变得可见时出现卡顿。起初我以为我的后台工作人员锁定了 UI 线程中的某些内容。我花了很多时间查看它,最终意识到当 UIImage 第一次变得可见时,它正在 UI 线程上进行一些额外的延迟处理。这让我很困惑,因为我的工作线程有用于解压缩 JPEG 数据的显式代码。

无论如何,凭直觉,我编写了一些代码来渲染到后台线程上的临时图形上下文中 - 果然,卡顿消失了。 UIImage 现在已预加载到我的工作线程上。到目前为止一切顺利。

问题是我的新“强制延迟加载图像”方法不可靠。它会导致间歇性的 EXC_BAD_ACCESS。我不知道 UIImage 在幕后实际上在做什么。也许它正在解压缩 JPEG 数据。不管怎样,方法是:

+ (void)forceLazyLoadOfImage: (UIImage*)image
{
CGImageRef imgRef = image.CGImage;

CGFloat currentWidth = CGImageGetWidth(imgRef);
CGFloat currentHeight = CGImageGetHeight(imgRef);

CGRect bounds = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);

CGAffineTransform transform = CGAffineTransformIdentity;
CGFloat scaleRatioX = bounds.size.width / currentWidth;
CGFloat scaleRatioY = bounds.size.height / currentHeight;

UIGraphicsBeginImageContext(bounds.size);

CGContextRef context = UIGraphicsGetCurrentContext();
CGContextScaleCTM(context, scaleRatioX, -scaleRatioY);
CGContextTranslateCTM(context, 0, -currentHeight);
CGContextConcatCTM(context, transform);
CGContextDrawImage(context, CGRectMake(0, 0, currentWidth, currentHeight), imgRef);

UIGraphicsEndImageContext();
}

EXC_BAD_ACCESS 发生在 CGContextDrawImage 行上。问题 1:我可以在 UI 线程以外的线程上执行此操作吗?问题 2:UIImage 实际上“预加载”是什么?问题 3:解决此问题的官方方法是什么?

感谢您阅读所有内容,任何建议将不胜感激!

最佳答案

我也遇到了同样的口吃问题,在一些帮助下我在这里找到了正确的解决方案:Non-lazy image loading in iOS

有两件重要的事情要提:

  • 不要在工作线程中使用 UIKit 方法。请改用 CoreGraphics。
  • 即使您有一个用于加载和解压缩图像的后台线程,如果您为 CGBitmapContext 使用了错误的位掩码,您仍然会遇到一些卡顿。这是您必须选择的选项(我仍然有点不清楚为什么):

-

CGBitmapContextCreate(imageBuffer, width, height, 8, width*4, colourSpace,
kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little);

我在这里发布了一个示例项目:SwapTest ,它与苹果照片应用程序加载/显示图像的性能大致相同。

关于iphone - CGImage/UIImage 在 UI 线程上延迟加载会导致卡顿,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1815476/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com