【问题标题】:OpenGL ES application crashes when locked screen or entered backgroundOpenGL ES 应用程序在锁定屏幕或进入背景时崩溃
【发布时间】:2012-10-17 03:05:24
【问题描述】:

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

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

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

感谢您的回答、CStreel 和其他试图提供帮助的人。

在第二次逐行阅读《OpenGL ES Programming Guide for iOS》中的“Background Applications May Not Execute Commands on the Graphics Hardware”部分后,我对这个问题有了新的理解。

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

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

【问题讨论】:

  • 如果您在后台从串行队列调用 OpenGL ES,问题仍然存在。即使在告诉计时器停止发射之后,一个块仍会继续完成并可能导致崩溃。 stackoverflow.com/questions/19215554/…

标签: ios opengl-es crash


【解决方案1】:

当您的应用程序即将进入后台时,如果您的应用程序调用任何 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.

【讨论】:

  • 我已经实现了这些委托以及通知。当应用程序退出活动状态时,我停止了捕获会话和动画。收到主动辞职通知后,我尝试在处理调度队列中调用 glfinish(),但没有帮助。
【解决方案2】:

通知可以是同步的或异步的。如果注册通知指定NSOperationQueue,回调会是异步的,否则我相信它永远是同步的。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-24
    • 1970-01-01
    • 1970-01-01
    • 2013-04-22
    • 1970-01-01
    相关资源
    最近更新 更多