结合UIView动画块和OpenGL ES渲染

时间:2012-04-12 09:31:55

标签: iphone animation opengl-es uikit quartz-graphics

我正在开发一款iP *游戏,我使用了UIKit和OpenGL ES 2.0。 UIKit元素在OpenGL视图上呈现,占据了大量(任意)的屏幕空间。我必须承认Apple已经做了出色的工作,游戏的帧率始终是60 FPS。

为了得出这个结论,我对性能做了很多测试:

  1. 我在OpenGL视图中添加了许多静态(不动)UIViews - OK!
  2. 我使用自定义代码动画相同的UIViews(修改了我游戏的drawFrame方法中的中心属性) - 好的!。
  3. 我在UIViews下添加了许多OpenGL ES元素 - OK!
  4. 我在UIViews下添加了许多移动的OpenGL ES元素 - OK!
  5. 所以,现在我想利用核心动画框架来动画UIKit元素。我利用

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

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

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

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

    你对此有什么解决方案吗? 所有测试均在带有iOS 5.1的iPad 2和iPhone 3GS上进行。

1 个答案:

答案 0 :(得分:9)

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

解决方案非常简单:

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