如何有效地显示许多图像? (iPhone编程)

时间:2010-03-24 12:09:05

标签: objective-c iphone uiimageview performance

在我的应用程序中,我需要像粒子系统这样的东西,所以我做了以下几点:

当应用程序初始化时,我加载了一个UIImage

laserImage = [UIImage imageNamed:@"laser.png"];

UIImage * laserImage在我的Controller接口中声明。现在,每当我需要一个新的粒子时,这个代码就会产生一个:

// add new Laserimage
UIImageView *newLaser = [[UIImageView alloc] initWithImage:laserImage];
[newLaser setTag:[model.lasers count]-9];
[newLaser setBounds:CGRectMake(0, 0, 17, 1)];
[newLaser setOpaque:YES];
[self.view addSubview:newLaser];
[newLaser release];

请注意,图像只有17px * 1px小,而model.lasers是一个内部数组,用于完成从图形输出分离的所有计算。所以在我的主绘图循环中,我将所有UIImageView的位置设置为我的model.lasers数组中的计算位置:

for (int i = 0; i < [model.lasers count]; i++) {
    [[self.view viewWithTag:i+10] setCenter:[[model.lasers objectAtIndex:i] pos]];
}

我将标记增加10,因为默认值为0,我不想使用默认标记移动所有视图。

因此动画看起来很好,大约有10到20张图像,但在处理大约60张图像时确实很慢。所以我的问题是:有没有办法优化这个,而无需在OpenGl ES中重新开始?

4 个答案:

答案 0 :(得分:8)

正如jeff7和FenderMostro所说,你正在使用高级API(UIKit),并且使用较低的API(CoreAnimation或OpenGL)可以获得更好的性能。 (cocos2d构建于OpenGL之上)

  • 您最好的选择是使用CALayers而不是UIImageViews,从UIImage获取CGImageRef并将其设置为这些图层的内容。

  • 此外,您可能希望保留CALayers池并通过隐藏/显示来重复使用它们。 60张17 * 1像素的CALayers并不多,我一直在用数百张这样做而不需要额外的优化。

这样,图像就已经解压缩并在视频内存中可用。当使用UIKit时,一切都通过CPU,更不用说创建非常重的UIViews了。

答案 1 :(得分:3)

似乎你正在尝试使用UIKit API来编写游戏代码,这并不是非常适合这种目的。在分配UIView时,您正在花费设备的资源,因为对象创建成本高,导致速度减慢。您可以通过删除CoreAnimation来获得所需的性能,这非常适合在有限的时间范围内绘制数百个图像,尽管如果您使用OpenGL或像Cocos2d这样的引擎仍然会好得多。

答案 2 :(得分:1)

UIImageView用于显示单个或多个图像。因此,不应每次创建UIImageView,而应考虑创建一个新图像并将其添加到UIImageView。

请参阅here

答案 3 :(得分:0)

我建议重新使用OpenGL ES,有一个很好的框架叫cocos2d for iPhone,它可以使这种类型的编程非常简单快捷。通过快速查看代码,您可以将激光重建为CCSprite,这是在场景中移动图像的简便方法。