【问题标题】:Suitability of using Core Animation on iOS vs using Cocos2D and OpenGL ES?在 iOS 上使用 Core Animation 与使用 Cocos2D 和 OpenGL ES 的适用性?
【发布时间】:2012-04-19 18:35:05
【问题描述】:
我在一本书中完成了breakout game 教程,但是球是一个 20x20 像素的图像,它跳帧并且移动不是很流畅。模拟器和 iPhone 4S(真机)就是这种情况。该代码没有使用NSTimer(可能会更慢),而是使用CADisplayLink 和UIImageView setFrame 来制作动画。
iOS 上的 Core Animation 不是很适合开发动画类型的游戏吗?说是不是游戏
- 入侵者 (Space Invaders)
- Breakout(作为教程中的游戏)
- 打砖块
- 愤怒的小鸟 / 割绳子 / 水果忍者
对于这些类型的游戏,Core Animation真的适合写上面(2)吗?对于 (1)、(3) 和 (4),无论是 Cocos2D 还是 OpenGL ES 都更适合做这项工作。并且 Cocos2D 和 OpenGL ES 的性能非常接近。这是真的吗?
【问题讨论】:
标签:
opengl-es
cocos2d-iphone
core-animation
【解决方案1】:
Cocos2D 经常被关注是因为它易于编写常见的游戏逻辑,例如碰撞检测和精灵动画、逐帧、缩放和其他在游戏开发中非常常见的过程,您可以将多个动画串在一起,然后组合,对它们进行排序,进行回调等等。这是引擎的一大优势。
但是,性能是另一回事。 Cocos 提供批处理节点,将所有图形元素组合到一个 OpenGL 调用中,而不是在每一帧中分别“绘制”到屏幕上;这可以显着提高性能,尤其是对于大型图形。如果你有跳帧,我想知道 Cocos 中的批处理精灵是否会是缺失的链接。
Core Animation 给我留下了深刻的印象,并希望它能够在游戏中出现性能问题。我的理解是 CA 和 Cocos 一样,也是建立在 OpenGL ES 之上的,所以我希望两者都能取得好的结果。可能在 Cocos 中这样做更容易,因为它在内部针对游戏开发进行了设计和优化。
【解决方案2】:
如果您在使用 2D 应用程序时遇到性能问题,这可能是由于不了解如何从 CoreGraphics 中获得最有效的结果,而不是切换到 OpenGL 可以解决的问题。 2D 游戏可以与 CoreGraphics 一起正常工作,您只需要从正确的方法开始。首先,您不应该在每个 CADisplayLink 回调中重新渲染整个视图。相反,设置一个包含多个 CALayer 对象的 UIView。像这样设置图层:CALayer.contents = (id) cgImage,然后让系统在 x、y 或动画元素发生变化时进行渲染。您只需要定位元素并定义移动元素的动画。通过这种方式,系统会在后台将动画图像缓存在显卡上,并使用 GPU 操作进行重绘。