tl; dr:可能您只需将GLKView
's设置contentMode
为UIViewContentModeRedraw
首先,我认为您的应用程序实际上并没有进入后台,我认为它只是变得不活动。applicationWillResignActive
和applicationDidEnterBackground
委托方法的区别。假设应用程序仅处于非活动状态,请使用以下内容,以防它实际上被置于后台,请参见下文。
苹果文档说您应该在applicationWillResignActive
被调用时“降低 OpenGL ES 帧速率”,而不是不允许 OpenGL ES 调用,这仅在应用程序进入后台后发生。
这意味着GLKit
's GLKView
/GLKViewController
在这方面可能有点过分热心。要修复它,您需要确保:
- 的
GLKView
设置contentMode
为UIViewContentModeRedraw
- 即使应用程序处于非活动状态但框架已更改, ' 方法也会绘制框架,但在
GLKView
应用drawRect
程序处于后台时不绘制框架(即使用 OpenGL ES 调用)。
但是,我的假设是,drawRect
当应用程序在后台时,甚至不会调用该方法,因此您可能不必担心glkView:drawInRect
委托方法中的 OpenGL ES 调用。但是,在您的情况下未调用此函数的原因是视图不会失效。未失效的原因有两个:
- 周期性地使视图无效的主框架循环
GLKViewController
被paused
属性暂停。
- 这
GLKView
contentMode
可能是默认的“UIViewContetModeScaleToFill”
由于该GLKView
drawRect
方法可能甚至没有查看paused
属性,因此仅更改contentMode
可能就足够了。
如果应用程序确实进入后台,我会提出以下解决方案。由于在后台运行时不允许使用 OpenGL ES 调用,因此解决方案非常简单:
在进入后台之前,做所有你需要做的 OpenGL ES 调用来支持你想要的东西。
也就是说,applicationWillResignActive
执行以下操作:
- 暂停你的游戏循环(通过设置
GLKViewController
's完成paused
)
- 暂停渲染循环(通过设置
GLKViewController
's完成paused
)
- 获取当前方向状态的当前帧缓冲区
- 使用对应于旋转方向状态的帧缓冲区和视口再次渲染当前游戏状态并获取该帧缓冲区
此外,您需要将GLKView
'scontentMode
设置为,UIViewContentModeRedraw
以便drawRect
在视图的框架因方向更改而更改后实际调用该方法。
最后在GLKView
'sdrawRect
方法中,您需要检查是否paused
正常进行渲染,在这种YES
情况NO
下,获取保存的帧缓冲区之一并通过常规调用将其绘制到视图中。NO
YES
applicationWillResignActive
UIKit
我不确定这个 hackish 解决方案与 集成的效果如何GLKit
,您可能需要一些子类化。