Tho*_*mas 9 iphone performance objective-c uiimageview
在我的应用程序中,我需要类似粒子系统的东西,所以我做了以下事情:
在应用程序初始化时,我加载了一个UIImage
laserImage = [UIImage imageNamed:@"laser.png"];
Run Code Online (Sandbox Code Playgroud)
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];
Run Code Online (Sandbox Code Playgroud)
请注意,图像只有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]];
}
Run Code Online (Sandbox Code Playgroud)
我将标记增加10,因为默认值为0,我不想使用默认标记移动所有视图.
因此动画看起来很好,大约有10到20张图像,但在处理大约60张图像时确实很慢.所以我的问题是:有没有办法优化这一点而无需在OpenGl ES中重新开始?
正如jeff7和FenderMostro所说,你正在使用高级API(UIKit),并且使用较低的API(CoreAnimation或OpenGL)可以获得更好的性能.(cocos2d构建于OpenGL之上)
您最好的选择是使用CALayers而不是UIImageViews,从UIImage获取CGImageRef并将其设置为这些图层的内容.
此外,您可能希望保留一个CALayers池并通过隐藏/显示来重用它们.60个17*1像素的CALayers并不多,我一直在用它做数百个而不需要额外的优化.
这样,图像将已经解压缩并在视频存储器中可用.当使用UIKit时,一切都通过CPU,更不用说创建非常重的UIViews了.
归档时间: |
|
查看次数: |
3183 次 |
最近记录: |