结合的UIView动画块和OpenGL ES渲染(Combining UIView animatio

2019-07-28 22:24发布

我正在开发一个IP *游戏,我利用这两个UIKit中和OpenGL ES 2.0。 所述的UIKit元素呈现在OpenGL的视图和占据的屏幕空间显著(任意的)的量。 我必须承认,苹果已经做了出色的工作和游戏的帧速率始终是60 FPS。

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

  1. 我增加了很多静态的(不动)UIViews在OpenGL的观点 - OK!
  2. 我的动画使用自定义代码相同UIViews(在我的游戏的并条机方法修改的中心属性) - OK!
  3. 我加入了UIViews在许多OpenGL ES的元素 - OK!
  4. 我加入了UIViews下许多动人的OpenGL ES的元素 - OK!

所以,现在我想利用核心动画框架,以动画的UIKit元素。 我利用

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

在奥得来执行的动画(我定位的iOS 4或更新版本)。

现在的问题是,帧速率有这种怪异的行为:有时我得到60 fps的很多很多 UIKit的动画元素(30元对我来说是OK)和其他一些倍帧速率显然是在60个FPS即使只有一个生动活泼的UIKit元素,但我不能用仪器测量它! 让我来解释更多:当我打开仪器和监控核心动画和/或OpenGL驱动程序我总是得到60个FPS。 很明显,这是不是这样的,我可以用我的眼睛看到了OpenGL的动画移动比顶部的相应的UIKit动画慢得多。 如果我从视图中移除的UIKit元件帧速率来恢复正常。 用一个类似的情况我在这里描述发生在任何OpenGL ES的游戏,当用户玩游戏时更改设备的音量。 当显示当前的音量的透明视图开始淡出,直到它完全消失帧速率急剧下降,但在仪器(I已经作出这个测试太)它被粘结在60帧!

所以,总结一下:有时我得到真正的60fps的有没有跌宕起伏的运行和其他一些时候,我得到假每秒60帧,没有大起大落块动画。

你有没有解决这个? 所有的测试都与iOS 5.1在iPad 2和iPhone 3GS进行

Answer 1:

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

该解决方案很简单:

  1. 对于您在你的OpenGL应用程序所需的每个UIView的,保持它的边界,中心,在你的OpenGL屏幕坐标系转换属性(如创建以下属性:GLBounds,GLCenter,GLTranform),并相应地更新它们,只要更改相应的UIView的一个属性。
  2. 当您启动游戏,加载UIViews但它们设置为隐藏 。 因此,UIKit中不会对OpenGL的视图(这样的丢帧问题完全elliminated)的顶部绘制 。相反使用您在步骤1中创建的GL *属性,并使用相应的纹理(图像/颜色自己绘制的UIViews时使用的每一个的UIView)。
  3. 使用取决于你想要达到的动画块/核心动画动画隐藏 UIViews性能(范围,中心和转换)(这反过来又更新您的GL *属性),并在你的OpenGL绘图方式使用GL *属性来绘制UIViews ! 要获取范围,中心的实际值,并在一个UIView的动画变换(和更新GL *属性)使用其表示层属性。

最好,



文章来源: Combining UIView animation blocks and OpenGL ES rendering