Ios OpenGL ES应用程序在锁定屏幕或进入后台时崩溃

Ios OpenGL ES应用程序在锁定屏幕或进入后台时崩溃,ios,opengl-es,crash,Ios,Opengl Es,Crash,我的应用程序是一个大量使用OpenGL的应用程序,用于处理图像、渲染场景、显示预览等。然而,在我将多任务作为苹果的官方文档“OpenGL ES iOS编程指南”实现后,奇怪的崩溃仍然偶尔出现。调试导航器堆栈跟踪显示类似“sgxPatchDeferredFramebufferOffsets”、“PresentrenderBufferExc_BAD_ACCESS”、“GPU_ReturnNotPermittedKillClient”等内容 所以,我想知道到底应该实现什么样的OpenGL ES多任务

我的应用程序是一个大量使用OpenGL的应用程序,用于处理图像、渲染场景、显示预览等。然而,在我将多任务作为苹果的官方文档“OpenGL ES iOS编程指南”实现后,奇怪的崩溃仍然偶尔出现。调试导航器堆栈跟踪显示类似“sgxPatchDeferredFramebufferOffsets”、“PresentrenderBufferExc_BAD_ACCESS”、“GPU_ReturnNotPermittedKillClient”等内容

所以,我想知道到底应该实现什么样的OpenGL ES多任务

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

谢谢你的回答,CStreel和其他试图帮助你的人

在第二次逐行阅读“OpenGL ES iOS编程指南”中的“后台应用程序可能无法在图形硬件上执行命令”部分后,我对这个问题有了新的理解

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


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

当你的应用程序即将进入后台时,如果你的应用程序调用任何OGLE函数,操作系统将立即杀死你的应用程序

有关更多信息,请阅读 阅读

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

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

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

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

我遇到过一些崩溃,并在代码中发现了一些bug:

  • 共享的EAGLContext,尽管是“多线程”的,但不是 始终在使用它的所有线程上设置。看来你必须这么做 每次主线程离开RunLoop时,在其上设置上下文 输入应用程序代码并发出任何openGL命令
  • iOS 6在更改缓冲区时需要额外的“glFlush()”,因为 显然是iOS 6中的一个bug。iOS 5和iOS 7未受影响
  • “DidEnterBackground”通知与其他代码/线程之间缺乏同步,这意味着当其他线程仍在使用openGL时,通知应用程序状态更改的主线程提前返回。保持通知线程,直到调用完openGL。只有在允许返回后,iOS才会在openGL上启动“看门狗”

  • 我使用DidEnterBackground/WillEnterForeground通知(而不是回调)来停止/重新启动openGL操作。我仍然会遇到一次非常罕见的崩溃(我必须使用自动化和锁定/解锁/旋转20-30分钟才能得到它),但使用WillResignActive/DidBecomeActive没有任何区别;不管怎样,它们都会发生。

    我已经实现了这些委托和通知。当应用程序退出活动状态时,我停止了捕获会话和动画。在收到退出活动通知后,我尝试在处理调度队列中调用glfinish(),但没有帮助。如果在后台从串行队列调用OpenGL ES,问题仍然存在。即使在告诉计时器停止射击后,一个方块仍会继续完成,并可能导致撞车。