【问题标题】:Performance problems on iPhone using simple graphics使用简单图形在 iPhone 上的性能问题
【发布时间】:2009-02-23 23:23:18
【问题描述】:

我们正在开发几个简单的游戏,但我们一直遇到一些性能问题,我很好奇这是代码问题还是“我们使用了错误的对象”问题。

我们的游戏基本上是简单的,工作如下:

我们有一个要加载的自定义视图,以及一个作为我们游戏引擎的自定义对象。该视图有一个像这样触发的计时器:

[NSTimer scheduledTimerWithTimeInterval:1.0 / 30.0 target:self selector:@selector(animationTimerMethod) userinfo:nil repeats:YES];

在我们的计时器方法中,我们有以下内容:

- (void)animationTimerMethod:(NSTimer*)timer 
{
  if([gameEngine doGameLoop])  //only redraw if we need to
    [self setNeedsDisplay];
}

我们的绘图代码非常简单,我们只是在屏幕上绘制了几幅图像,使用类似于以下的代码:

- (void)drawRect:(CGRect)rect
{
  CGGraphicsContext ctx = UIGraphicsGetCurrentContext();
  CGContextDrawImage(ctx, someRect, someImage);
}

我们遇到的主要问题是对触摸的响应能力。我们的代码在 touchesBegan 方法中多次不会得到响应。这只是核心图形库的限制吗?我们应该使用OpenGL吗?是否有其他方法可以制作响应更快的简单动画(甚至不是在屏幕上移动的对象,对于同一位置的对象只需 6 帧左右的动画)?

非常感谢!

【问题讨论】:

    标签: objective-c iphone cocoa-touch


    【解决方案1】:

    肯定有办法加快速度。每帧手动重绘图像意味着您正在重绘可以重复使用的纹理。您可以通过移动到 OpenGL 或将图像移动到 CALayer 中来重用它们,然后只需重新定位图层而不是重绘图像。

    如果您不想迁移到 OpenGL,您可能还会看到通过迁移到 CAAnimation 而不是让您的代码计算每一帧的显着性能提升,但这可能需要对引擎进行重大更改。

    此外,如果您可以避免避免 alpha 合成,那么速度会大大提高。

    【讨论】:

    • 在这种情况下,我不会移动图像...我会不时更改它们(做简单的就地动画)...会移动到图层或 CAAnimation仍然有所作为?
    • 我目前正在研究 alpha 的东西...看起来 绘制背景(但有一个带 alpha 的主角)会产生很大的不同...可能是因为前景中具有 alpha 的图像正在绘制纯色而不是图像,这会减少 CPU 时间?
    • 最后...就 OpenGL 教程而言,那里有很好的资源吗?到目前为止,我的 Google-fu 让我失望了……
    • 如果你的帧数很少,我认为CoreAnimation可以为你缓存它们,这确实会加快速度。
    • 使用 CoreAnimation 的一大区别是屏幕刷新发生在另一个线程中。这可能会极大地帮助响应用户事件......
    【解决方案2】:

    我的第一个问题是你的图片有透明度吗?

    具有高效果性能的透明图像。 在 Apple 的文档中,他们多次提到这一点。

    我要问的第二件事是,您是否尝试过在 Instruments 和/或 Shark 中运行您的应用程序?这两个应用程序都可以帮助您了解问题所在。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多