仪器优化 UIImageView

Posted

技术标签:

【中文标题】仪器优化 UIImageView【英文标题】:Instruments Optimization UIImageView 【发布时间】:2013-02-05 17:31:36 【问题描述】:

我正在使用以下代码加载一堆 UIImages(本地的并与应用程序一起预加载):

NSString*plistPath = [[NSBundle mainBundle] pathForResource:@"images" ofType:@"plist"];
NSArray *array = [NSArray arrayWithContentsOfFile:plistPath];
NSMutableArray *finalArray = [[NSMutableArray alloc] initWithCapacity:array.count];
for(int i=0;i<array.count; i++) 
    [finalArray addObject:[UIImage imageNamed:[NSString stringWithFormat:@"%@",[array objectAtIndex:i]]]];

然后在collectionView中:

cell.cellImage.image = [finalArray objectAtIndex:indexPath.row];

collectionView 的呈现有很大的延迟。我通过以下仪器屏幕截图捕捉到了这种延迟:

该延迟(由用户体验并显示在图表中)与下面的实际调用树之间存在重大脱节,显示没有延迟。我在 collectionView 的每个单元格中加载 500k jpg。这个 Instruments 分析基本上是说我在代码中无能为力,这是系统库延迟吗?

编辑:我的问题不再是关于我的 collectionView 的这个特定用例。一般是关于仪器的。如果我在屏幕截图中选择了选项,并且应用程序显示明显滞后,但时间分析器没有,我可以在我的代码中做些什么来提高速度吗?我想我更一般地询问时间分析器、设置及其结果。如果所有的延迟都归因于较低级别的代码或系统框架,我能做些什么吗?

【问题讨论】:

你能稍微描述一下你的collectionView吗?我猜它的单元格尺寸很小? 请看我的编辑。谢谢。 【参考方案1】:

您在右侧设置面板中启用了Hide System Libraries 复选框,因此它将隐藏对您未定义的方法的任何调用。因此,例如,如果您多次调用imageNamed: 并且选中了此复选框,您将看不到系统解压缩和加载这些图像所花费的时间。

所以从技术上讲,所有“滞后”/缓慢都在系统框架中,但您可以控制更改使用它们的方式。您还可以监控系统框架中的哪些操作在时间上最昂贵。

取消选中此框是解决方案:

【讨论】:

这是我一直在寻找的反馈【参考方案2】:

imageNamed: 将缓存您的图像。 使用imageWithContentsOfFile: 避免缓存。 希望这会加快您的加载速度。

【讨论】:

似乎没有帮助:NSString *filePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:[array objectAtIndex:i]]; [finalArray addObject:[UIImage imageWithContentsOfFile:filePath]];【参考方案3】:

您是否将它们加载到后台/单独的线程中,如果没有,请这样做将解决您的问题并将它们加载到队列中。所以一旦图像被加载,通知将使用它的对象并将图像对象传递给它。

创建一个简单的 NSOperation 来加载图像并通知分配给它的委托。为您要加载的每个图像创建此类的对象并将其添加到 NSOperationQueue 并将 NSOperationQueue 的最大并发操作数设置为 1。

【讨论】:

以上是关于仪器优化 UIImageView的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 仪器中查找所有 openGL 调用

22.jvm参数优化

iOS - 优化。缓存图像

WinCE项目应用之虚拟仪器(VI)

错误 - 未注册仪器!必须在注册仪器下运行

测控技术与仪器专业好不好