objective-c - 如何高效展示多张图片? (iPhone编程)

标签 objective-c iphone uiimageview performance

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

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

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

UIImage *laserImage 在我的 Controller 的接口(interface)中声明。现在每次我需要一个新粒子时,这段代码都会生成一个:

// 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,我不想移动所有带有默认标签的 View 。

因此,动画在处理大约 10 - 20 张图像时看起来不错,但在处理大约 60 张图像时确实变慢了。所以我的问题是:有没有什么方法可以优化它而无需在 OpenGl ES 中重新开始?

最佳答案

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

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

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

这样,图像将已经解压缩并在显存中可用。使用 UIKit 时,一切都通过 CPU,更不用说创建 UIView 了,它们是非常重的对象。

关于objective-c - 如何高效展示多张图片? (iPhone编程),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2507441/

相关文章:

iphone - 使用 UIBackgroundModes 在后台模式下运行代码

javascript - 隐藏 iPhone 键盘上方的工具栏,PhoneGap

html - 尽管将其设置为 scale=1,但 Bootstrap 模型未在 iPhone 5s 的全视口(viewport)中显示

ios - 如何将某些内容分配给可变名称的 UIImageView?

objective-c - 卡恩算法和可达性

ios - 在Objective-c编程中连续调用 "SetNeedDisplay"方法时收到内存警告

iphone - 获取 BarButtonSystemItem 的宽度

iphone - xcode webview 错误不工作

ios - 如果以编程方式创建,则无法访问 UIImageView

iphone - 裁剪圆形图像