该应用程序使用OpenGL ES2和GLKit框架,以及GLKitViewController提供的渲染/更新循环。它曾经在我的iPad2上使用iOS7.1以稳定的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会花费更长时间?
答案 0 :(得分:0)
问题的原因由Jim Hillhouse确定,并由Frogblast在Apple Dev论坛帖子"OpenGL Performance Drops > 50% in iOS 8 GM"上确认:在视图中设置UITextField(或UILabel,在我的情况下)的text属性GLKView的子视图导致GLKView超级视图布局,然后导致帧缓冲区被释放并重新分配。这在iOS 7中没有发生。
Jim Hillhouse的解决方法是将子视图放在UIViewController中,并将其嵌入到GLKView中。我已经做了同样的事情,使用容器视图来保存视图控制器,并且可以确认它是否有效。