kpo*_*wer 7 ipad screen-rotation ios glkit
我的应用程序用于GLKit渲染3D场景OpenGL ES.
一切都很好,除了一件事.当我在iPad中启动我的应用程序并显示后台应用程序栏(单击双击"主页"按钮)然后更改设备的方向时,场景会被错误更新(最后渲染的图像只是拉伸以填充新的矩形).
我找到了原因.当出现后台应用程序栏时,GLKViewController's paused将YES自动设置(应用程序委托接收-applicationWillResignActive:),并且在此栏关闭之前不会进行渲染.
我在Apple指南(iOS的OpenGL ES编程指南/实现多任务感知的OpenGL ES应用程序)中找到了,在收到-applicationWillResignActive:应用程序后应停止GL渲染或终止.所以似乎一切都好,除了轮换后的糟糕渲染:)
我检查了一些OpenGL游戏.当显示此栏时,它们也会"暂停",但不知何故正确更新设备旋转时暂停的场景.他们是如何做到这一点的?
tl;dr: 可能你只需要GLKView设置contentMode为UIViewContentModeRedraw
首先,我不认为您的应用程序实际上进入后台,我认为它只是变得不活动。applicationWillResignActive和委托方法之间的区别applicationDidEnterBackground。假设应用程序仅处于非活动状态,请使用以下内容,以防它实际上被放入后台,然后参见下文。
苹果文档说,当被调用时,您应该“降低 OpenGL ES 帧速率” applicationWillResignActive,而不是不允许 OpenGL ES 调用,只有在应用程序进入后台后才会发生这种情况。
这意味着GLKit's GLKView/GLKViewController在这方面可能有点过于热心了。要修复它,您需要确保:
GLKView被contentMode设置为UIViewContentModeRedrawGLKView即使应用程序处于非活动状态但框架已更改,的方法也会绘制框架,但当应用程序位于后台时不会绘制框架(即使用 OpenGL ES 调用drawRect)。但是,我的假设是,drawRect当应用程序位于后台时,该方法甚至不会被调用,因此您可能不必真正担心glkView:drawInRect委托方法中的 OpenGL ES 调用。然而,在您的情况下不会调用此函数的原因是视图不会失效。不被宣告无效的原因有两个:
GLKViewController定期使视图无效的主框架循环由paused由该属性暂停。GLKView contentMode可能是默认的“UIViewContetModeScaleToFill”由于该GLKView drawRect方法可能甚至不查看该paused属性,因此仅更改该属性contentMode可能就已经足够了。
如果应用程序确实进入后台,我会提出以下解决方案。由于在后台运行时不允许使用 OpenGL ES 调用,因此解决方案非常简单:
在进入后台之前,执行您需要执行的所有 OpenGL ES 调用以支持您想要的功能。
也就是说,applicationWillResignActive执行以下操作:
GLKViewController完成paused完成)GLKViewController设置paused完成)此外,您需要GLKView将其contentMode设置UIViewContentModeRedraw为drawRect在视图的框架因方向更改而更改后实际调用该方法。
最后,在的GLKView方法中drawRect,您需要检查是否paused正常渲染,在这种情况下,采用保存在其中的帧缓冲区之一并将其绘制到常规视图YESNONOYESapplicationWillResignActiveUIKit。
我不确定这个黑客解决方案与 的集成效果如何GLKit,您可能需要一些子类化。
| 归档时间: | 
 | 
| 查看次数: | 1485 次 | 
| 最近记录: |