0

该应用程序使用 OpenGL ES2 和 GLKit 框架,以及 GLKitViewController 提供的渲染/更新循环。它曾经在装有 iOS7.1 的 iPad2 上以稳定的 60 fps 运行,但是一旦我将 iPad2 更新到 iOS8.1,完全相同的代码现在在 56-59 FPS 之间波动。(但是,CPU 利用率仍然保持在 40-60% 和以前一样)。

分析显示 OpenGL 绘图命令使用的 CPU 时间比以前大得多。最大的变化似乎是对“GLKBaseEffect prepareToDraw”的调用比以前花费了更长的时间。

(该应用程序使用单个 GLKBaseEffect,它在渲染循环期间的各个点重新配置,每次都需要调用 prepareToDraw。我意识到可以通过拥有多个 GLKBaseEffect 实例来优化,这是我稍后考虑的,但是,在 iOS7.1 上,性能确实很稳定)

我现在正在检查 Instruments 中的 OpenGL ES Analyzer 跟踪,以确定由“GLKBaseEffect prepareToDraw”生成的 OpenGL 调用,看看是否有任何异常,一旦我设法弄清楚任何事情,就会相应地更新帖子。

对于如何在这一点上取得进展的任何指导,我将非常感激 - 为什么在 iOS8.1 上调用 GLKBaseEffect prepareToDraw 可能需要更长的时间?

4

1 回答 1

0

问题的原因由 Jim Hillhouse 确定,并由 Frogblast 在 Apple Dev Forums 线程“iOS 8 GM 中的 OpenGL 性能下降 > 50%”中确认:在作为 GLKView 的子视图的视图导致 GLKView 超级视图进行布局,然后导致帧缓冲区被释放和重新分配。这在 iOS 7 中没有发生。

Jim Hillhouse 的解决方法是将子视图放在 UIViewController 中,并将其嵌入到 GLKView 中。我也做了同样的事情,使用一个容器视图来保存视图控制器,并且可以确认它可以工作。

于 2014-12-10T12:07:11.673 回答