gpt4 book ai didi

ios - 如何找到 UIImage 瓶颈

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:20:36 26 4
gpt4 key购买 nike

我有一个使用 UIImage 对象的应用程序。到目前为止,我一直在使用像这样初始化的图像对象:

UIImage *image = [UIImage imageNamed:imageName];

在我的应用程序包中使用图像。我一直在添加功能,以允许用户通过 UIImagePickerController 使用相机或他们的库中的图像。显然,这些图像不能在我的应用程序包中,因此我以不同的方式初始化 UIImage 对象:

UIImage *image = [UIImage imageWithContentsOfFile:pathToFile];

这是在首先将图像大小调整为与我的应用程序包中的其他文件相似的大小后完成的,包括像素尺寸和总字节数,两者都使用 Jpeg 格式(有趣的是,即使文件大小相同,PNG 也慢得多).换句话说,pathToFile 指向的文件是一个与包中的图像大小相似的文件(像素尺寸匹配,并且选择了压缩,因此字节数相似)。

该应用通过一个循环从原始图像制作小块,以及与本文无关的其他内容。我的问题是,使用以第二种方式创建的图像完成循环比使用以第一种方式创建的图像花费更长的时间。

我知道第一种方法缓存图像,但我认为这不相关,除非我不了解缓存的工作原理。如果是相关因素,我该如何为第二种方法添加缓存?

导致瓶颈的相关代码部分是这样的:

[image drawInRect:self.imageSquare];

这里,self 是 UIImageView 的子类。它的属性 imageSquare 只是一个定义绘制内容的 CGRect。这部分对于两种方法都是相同的。那么,为什么第二种方法对于类似大小的 UIImage 对象要慢得多?

我可以做些什么来优化这个过程吗?

编辑:我将对包中图像的访问权限更改为 imageWithContentsOfFile,并且执行循环的时间从大约 4 秒更改为一分多钟。所以看起来我需要找到一些方法来像 imageNamed 那样进行缓存,但使用非捆绑文件。

最佳答案

UIImage imageNamed 不只是缓存图像。它缓存一个未压缩图像。花费的额外时间不是从本地存储读取到 RAM 造成的,而是解压缩图像造成的。

解决方案是创建一个新的未压缩的 UIImage 对象并将其用于代码的时间敏感部分。当该部分代码完成时,将丢弃未压缩的对象。为了完整起见,这里是类方法的副本,用于从压缩对象返回未压缩的 UIImage 对象,感谢 another thread .请注意,这假定数据位于 CGImage 中。 UIImage 对象并非总是如此。

+(UIImage *)decompressedImage:(UIImage *)compressedImage
{
CGImageRef originalImage = compressedImage.CGImage;
CFDataRef imageData = CGDataProviderCopyData(
CGImageGetDataProvider(originalImage));
CGDataProviderRef imageDataProvider = CGDataProviderCreateWithCFData(imageData);
CFRelease(imageData);
CGImageRef image = CGImageCreate(
CGImageGetWidth(originalImage),
CGImageGetHeight(originalImage),
CGImageGetBitsPerComponent(originalImage),
CGImageGetBitsPerPixel(originalImage),
CGImageGetBytesPerRow(originalImage),
CGImageGetColorSpace(originalImage),
CGImageGetBitmapInfo(originalImage),
imageDataProvider,
CGImageGetDecode(originalImage),
CGImageGetShouldInterpolate(originalImage),
CGImageGetRenderingIntent(originalImage));
CGDataProviderRelease(imageDataProvider);
UIImage *decompressedImage = [UIImage imageWithCGImage:image];
CGImageRelease(image);
return decompressedImage;
}

关于ios - 如何找到 UIImage 瓶颈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18750686/

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