繁体   English   中英

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

[英]OpenGL ES application crashes when locked screen or entered background

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

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

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

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

在第二次“OpenGL ES编程指南”中阅读“背景应用程序可能无法在图形硬件上执行命令”部分后,我逐一了解这个问题。

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

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

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

阅读App States&Multitasking获取更多信息阅读成为负责任的背景应用程序

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

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

关于OGLES

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

通知可以是同步的或异步的。 如果您注册指定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没有任何区别; 无论如何都会发生

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM