当锁定屏幕或输入背景时,OpenGL ES应用程序崩溃

时间:2012-10-17 03:05:25

标签: ios opengl-es crash

我的应用程序是一个大量使用的OpenGL,它用于处理图像,渲染场景,显示预览等。但是,在我实现Apple的官方文档“iOS的OpenGL ES编程指南”的多任务之后,很奇怪崩溃仍然偶尔出现。 Debug Navigator Stack trace显示类似'sgxPatchDeferredFramebufferOffsets','presentRenderbuffer EXC_BAD_ACCESS','gpus_ReturnNotPermittedKillClient'等。

所以,我想知道究竟应该实现OpenGL ES多任务。

=============更新:解决问题============

感谢您的回答,CStreel以及其他试图提供帮助的人。

第二次在'OpenGL ES编程指南for iOS'中阅读'背景应用程序可能无法在图形硬件上执行命令'部分后,我对这个问题有了新的认识。

我的应用程序的一个大问题是我不应该在通知方法中实现OpenGL ES多任务。因为,与委托方法不同,通知方法将被异步调用,这些停止动画操作和glFinish当应用程序已经移入后台时,()调用可能不会生效。当我执行一系列与OpenGL ES相关的操作时,当我点击锁定屏幕按钮时,这可能会更频繁地发生。

如果你们发现了其他一些问题,请随时与我联系。

2 个答案:

答案 0 :(得分:4)

当您的应用即将进入后台时,如果您的应用调用任何OGLES功能,操作系统将立即终止您的应用

阅读App States & Multitasking以获取更多信息 阅读Being a Responsible Background App

以下是该文件的一些摘录:

(Required) When moving to the background, make sure your app adjusts its behavior appropriately.

关于OGLES

 ...the app should stop calling OpenGL ES functions.

答案 1 :(得分:0)

通知可以是同步的也可以是异步的。如果您注册指定NSOperationQueue的通知,则回调将是异步的,否则我相信它将始终是同步的。

我遇到了一些崩溃,并在我的代码中发现了一些错误:

  1. 共享EAGLContext,尽管是"多线程"不是 始终使用它设置所有线程。看来你必须这样做 每次离开RunLoop时在主线程上设置上下文 输入您的应用程序代码并发出任何openGL命令。
  2. iOS 6需要额外的" glFlush()"在更换缓冲区时,到期 显然是iOS 6中的一个错误.iOS 5和7未受影响。
  3. " DidEnterBackground"之间缺乏同步通知和其他代码/线程,这意味着当其他线程仍在使用openGL时,通知应用程序状态更改的主线程提前返回。保持通知线程,直到完成调用openGL。只有在允许返回后,iOS才会启动"看门狗"在openGL上。
  4. 我使用DidEnterBackground / WillEnterForeground通知(而不是回调)来停止/重启openGL操作。我仍然得到一个非常罕见的崩溃(我必须使用自动化和锁定/解锁/旋转20-30分钟才能获得它),但使用WillResignActive / DidBecomeActive没有任何区别;他们无论如何都会发生。