【问题标题】:iPhone programming Quartz SlowiPhone 编程 Quartz Slow
【发布时间】:2010-08-26 14:56:40
【问题描述】:

我正在制作一个需要在屏幕上绘制多个图像的游戏。我为此使用的代码是:

- (void)drawRect:(CGRect)rect {
   for (i=1;i<=totalImages;i++) {
       if (imageExists[i]) {
           [image drawAtPoint:CGPointmake(imageX[i],imageY[i])];
       }
   }
} 

这个drawRect被一个函数调用:

-(void) gameLoop {
   [self setNeedsDisplay];
}

并且游戏循环被计时器每秒调用 60 个计时器:

[NSTimer scheduledTimerWithTimerInterval:0.01666 target:self selector:@selector(gameLoop) userInfo:nil repeats:YES];

imageExists[]、imageX[] 和 imageY[] 是我在游戏代码中用来创建/删除和在屏幕上移动图像的数组。

我的问题是,当我有大约 40 张图像在移动时,帧速度几乎比只有 1 张图像时减半。我的游戏最多需要 88 张图片。 (这只发生在我在我的 iPod Touch 上测试它时,在模拟器中一切正常......)

我的问题是:为什么 drawrect 函数这么慢,还是 drawAtPoint?我该如何解决这个问题?我应该实际使用它来绘制图像,还是应该学习 OpenGL ES 来制作游戏?

【问题讨论】:

  • 我不建议将其作为答案,因为我不知道效果,但是如果您改为使用 CALayers 作为精灵会发生什么。只需在 CALayers 上调用 -setContents ,然后通过 CGImage 设置它们的边界来初始化它们中的每一个。然后通过在图层上调用 -setPosition(或使用显式动画)为精灵设置动画。我建议这样做的原因是因为核心动画在 OpenGL 之上运行,而无需显式使用 OpenGL。我只是想知道它是否会给您带来更好的性能。
  • @Matt - 你应该把这个作为答案,因为它是解决他的性能问题的完美解决方案。

标签: iphone performance drawing quartz-graphics


【解决方案1】:

我的建议是研究像 cocos2d-iphone 这样的游戏库,它会在幕后为您处理大部分 OpenGL 内容。对于典型的游戏功能,它将获得比 Quartz 和 CoreAnimation 更高的性能,并且包括用于集成游戏交互性的物理和声音库等内容。

写入 OpenGL 可以为 2D 游戏做的主要事情是更好地管理进入视频内存的内容与保留在 RAM 中的内容,这在将精灵传送到屏幕上的正确位置时非常重要。

【讨论】:

  • 我会研究 Cocos2d-iPhone 谢谢^^
【解决方案2】:

几件事:

  • 不要使用计时器。使用 CADisplayLink。它就像一个计时器,只是它会在 vsync 上触发。查看 Apple 的文档。

  • 是的,您肯定想采用 OpenGL|ES 方式。在这里,问题是您在每帧重绘时将 40 多个纹理从 CPU 推送到 GPU。在 OpenGL|ES 中,您可以一次推送所有纹理,然后告诉 GPU“移动”它们。这会更有效率。 (即稳定的 60fps,以及非常低的 CPU 使用率)。

【讨论】:

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