我正在开发一个 iP* 游戏,我同时使用 UIKit 和 OpenGL ES 2.0。UIKit 元素在 OpenGL 视图上呈现并占用大量(任意)屏幕空间。我必须承认,Apple 做得非常出色,游戏的帧率始终是 60 FPS。
为了得出这个结论,我对性能进行了许多测试:
- 我在 OpenGL 视图上添加了许多静态(不移动)的 UIView——好的!
- 我使用自定义代码对相同的 UIViews 进行了动画处理(在我的游戏的 drawFrame 方法中修改了 center 属性)——好的!
- 我在 UIViews 下添加了许多 OpenGL ES 元素——好的!
- 我在 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 上进行