结合 UIView 动画块和 OpenGL ES 渲染

Posted

技术标签:

【中文标题】结合 UIView 动画块和 OpenGL ES 渲染【英文标题】:Combining UIView animation blocks and OpenGL ES rendering 【发布时间】:2012-04-12 09:31:54 【问题描述】:

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

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

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

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

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

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

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

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

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

【问题讨论】:

【参考方案1】:

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

解决方法很简单:

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

最好的,

【讨论】:

以上是关于结合 UIView 动画块和 OpenGL ES 渲染的主要内容,如果未能解决你的问题,请参考以下文章

如何在 UIView 中绘制 opengl es

使用 CADisplayLink“结合”与 CAMediaTimingFunction 为 UIView 设置动画。 (获得任意曲线)

[图形学] 基于OpenGL ES 3.0的高效目标变形动画

使用 CADisplayLink 的 iOS OpenGL ES 1.1 生涩动画(重启修复了一段时间)

使用 openGL ES 2.0 结合其他线条绘制功能的字体渲染(Freetype)不起作用

我的OpenGL学习进阶之旅如何在Android中使用ARCore结合OpenGL ES来实现增强人脸Augmented Faces?