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

Objective c 如何有效地显示许多图像?(iPhone编程),objective-c,iphone,uiimageview,performance,Objective C,Iphone,Uiimageview,Performance,在我的应用程序中,我需要类似粒子系统的东西,因此我做了以下工作: 当应用程序初始化时,我加载一个UIImage laserImage = [UIImage imageNamed:@"laser.png"]; UIImage*laserImage在我的控制器的接口中声明。现在每当我需要一个新粒子时,这个代码就会生成一个: // add new Laserimage UIImageView *newLaser = [[UIImageView alloc] initWithImage:laserIm

在我的应用程序中,我需要类似粒子系统的东西,因此我做了以下工作:

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

laserImage = [UIImage imageNamed:@"laser.png"];
UIImage*laserImage在我的控制器的接口中声明。现在每当我需要一个新粒子时,这个代码就会生成一个:

// 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,且为小型模型。激光器是一个内部阵列,用于执行与图形输出分离的所有计算。因此,在我的主绘图循环中,我将UIImageView的所有位置设置为model.lasers数组中的计算位置:

for (int i = 0; i < [model.lasers count]; i++) {
    [[self.view viewWithTag:i+10] setCenter:[[model.lasers objectAtIndex:i] pos]];
}
for(int i=0;i<[model.lasers count];i++){
[[self.view view with tag:i+10]设置中心:[[model.objectAtIndex:i]pos]];
}
我将标记增加了10,因为默认值为0,并且我不想移动带有默认标记的所有视图


因此,动画在大约10-20幅图像时看起来很好,但在处理大约60幅图像时速度会变慢。因此,我的问题是:有没有办法在不重新使用OpenGl ES的情况下对此进行优化?

我建议重新使用OpenGl ES,有一个名为的优秀框架可以使这种编程非常简单和快速。通过快速查看您的代码,您可以将激光器重新建模为
CCSprite
,这是一种在场景中移动图像的简单方法。

UIImageView可显示单个或多个图像。因此,不是每次创建一个UIVIEVIEW,而是应该考虑创建一个新的图像并将其添加到UIIVIEVIEW中。
请参阅。

似乎您正在尝试使用UIKit API编写游戏,但它并不非常适合这种用途。无论何时分配UIView,都会消耗设备的资源,这会导致速度减慢,因为对象创建成本很高。您可以通过访问CoreAnimation来获得所需的性能,CoreAnimation非常擅长在有限的时间内绘制数百幅图像,但如果您使用OpenGL或Cocos2d之类的引擎,效果会更好。

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

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

  • 此外,您可能希望保留一个Calayer池,并在必要时通过隐藏/显示来重用它们。60个17*1像素的Calayer并不多,我已经用了数百个Calayer,而不需要额外的优化


通过这种方式,图像将被解压缩并在视频内存中可用。当使用UIKit时,一切都要经过CPU,更不用说UIView的创建了,UIView是非常沉重的对象。

苹果的文档称UIImageView用于显示单个图像或设置一系列图像的动画。因为我需要一次显示所有图像,所以我无法使用此功能。。。还有其他想法吗?哦,对不起,托马斯,我不知道该怎么办。让我们等待社区是否有其他答案。嗨,托马斯,问题可能是你没有清除绘图上下文。你能再核实一下吗?你指的是哪种情况?我应该为所有图像启用“在绘制之前清除上下文”吗?父视图?非常感谢你的帮助!您还没有向我们展示如何制作动画,所以我只是猜测:-如果有帮助的话,我们可以试试这个:CGContextClearRect(UIGraphicsGetCurrentContext(),rect);我只是快速浏览了一下cocos2d,它似乎很有能力,但我几乎完成了我的应用程序,重写会花费太多时间。你还有别的想法吗?这是正确的答案。只要您使用CALayers,并且将每个层使用相同的layer.contents设置为相同的CG图像,您的代码就可以正常工作。在OpenGL中重新构建您的整个游戏会有点过头,您只需要不分配大量的UIImageView,这是实现问题的根源。看见