8

我正在开发一个 iP* 游戏,我同时使用 UIKit 和 OpenGL ES 2.0。UIKit 元素在 OpenGL 视图上呈现并占用大量(任意)屏幕空间。我必须承认,Apple 做得非常出色,游戏的帧率始终是 60 FPS。

为了得出这个结论,我对性能进行了许多测试:

  1. 我在 OpenGL 视图上添加了许多静态(不移动)的 UIView——好的!
  2. 我使用自定义代码对相同的 UIViews 进行了动画处理(在我的游戏的 drawFrame 方法中修改了 center 属性)——好的!
  3. 我在 UIViews 下添加了许多 OpenGL ES 元素——好的!
  4. 我在 UIViews 下添加了许多移动的 OpenGL ES 元素——好的!

所以,现在我想利用 Core Animation Framework 来为 UIKit 元素设置动画。我利用

[UIView animateWithDuration:delay:options:animations:completion:]

为了执行动画(我的目标是 iOS 4 或更高版本)。

现在的问题是帧速率有这种奇怪的行为:有时我得到 60 fps 的许多UIKit 动画元素(30 个元素对我来说是可以的),有时帧速率明显低于 60 fps,即使使用单个动画 UIKit元素,但我无法用仪器测量它!让我解释一下:当我打开 Instruments 并监控核心动画和/或 OpenGL 驱动程序时,我总是得到 60 fps。很明显,情况并非如此,我可以用肉眼看到 OpenGL 动画的移动速度比顶部相应的 UIKit 动画慢得多。如果我从视图中删除 UIKit 元素,则帧速率会恢复正常。当用户在玩游戏时改变设备的音量时,在任何 OpenGL ES 游戏中都会发生与我在这里描述的情况类似的情况。当显示当前音量的透明视图开始淡出并直到它完全淡出时,帧速率急剧下降,但在仪器中(我也做过这个测试)它卡在 60 fps!

所以,总结一下:有时我会得到真正的 60 fps 的块动画,跑步时没有起伏,有时我会得到假的 60 fps,没有起伏。

你有什么解决办法吗?所有测试均在装有 iOS 5.1 的 iPad 2 和 iPhone 3GS 上进行

4

1 回答 1

9

我设法解决了这个问题,现在我可以在我的 OpenGL 游戏中组合基于 UIView 块/核心的动画,而不会出现任何性能下降。

解决方案非常简单:

  1. 对于您希望在 OpenGL 应用程序中使用的每个 UIView,将其边界、中心和变换属性保留在您的 OpenGL 屏幕坐标系中(例如,创建以下属性:GLBounds、GLCenter、GLTranform)并在您更改相应 UIView 之一时相应地更新它们特性。
  2. 当你开始游戏时,加载 UIViews 但将它们设置为hidden。因此,UIKit不会在 OpenGL 视图之上绘制(这样完全消除了丢帧问题)。而是使用您在步骤 1 中创建的 GL* 属性并使用相应的纹理(图像/颜色)自己绘制 UIView您用于每个 UIView)。
  3. 使用块/核心动画为隐藏的UIViews 属性(边界、中心和变换)设置动画,具体取决于您想要实现的动画(这反过来会更新您的 GL* 属性),并在您的 OpenGL 绘制方法中使用 GL* 属性来绘制 UIViews !要在 UIView 动画(并更新 GL* 属性)时获取边界、居中和变换的实际值,请使用它的 presentationLayer 属性。

最好的,

于 2012-04-21T13:51:24.223 回答