我的应用程序是一个大量使用的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相关的操作时,当我点击锁定屏幕按钮时,这可能会更频繁地发生。
如果你们发现了其他一些问题,请随时与我联系。
答案 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的通知,则回调将是异步的,否则我相信它将始终是同步的。
我遇到了一些崩溃,并在我的代码中发现了一些错误:
我使用DidEnterBackground / WillEnterForeground通知(而不是回调)来停止/重启openGL操作。我仍然得到一个非常罕见的崩溃(我必须使用自动化和锁定/解锁/旋转20-30分钟才能获得它),但使用WillResignActive / DidBecomeActive没有任何区别;他们无论如何都会发生。