他们建议:
使用 GCD 时,使用专用的串行队列向 OpenGL ES 分发命令;这可以用来替换传统的互斥体模式。
我不明白这个建议。有一个我无法解决的冲突:
当应用的应用委托接收到-applicationWillResignActive
调用时,它必须立即停止调用任何 OpenGL 函数。
如果应用返回后继续调用OpenGL函数-applicationWillResignActive
,应用会崩溃。
如果我按照 Apple 的建议在串行后台队列中调用 OpenGL 函数,我将面临这个看似无法解决的问题:
1)收到后-applicationWillResignActive
我必须立即停止调用任何进一步的 OpenGL 函数。
2)但是由于串行队列在后台处理一段代码,有时代码块执行完after
-applicationWillResignActive
返回,应用程序崩溃。
这是显示并发“块”的插图。主线程收到完全停止消息,并且必须阻止对 OpenGL ES 的进一步调用。但不幸的是,这些发生在后台队列中,在处理块时无法停止:
|_____main thread: "STOP calling OpenGL ES!"_____|
_____|_____drawing queue: "Draw!"_____|_____drawing queue: "Draw!"_____|
从技术上讲,我发现无法立即停止后台队列并避免在后台进一步调用 OpenGL。提交的代码块一旦运行就会继续运行。
我找到的唯一解决方案是不在后台调用 OpenGL ES 函数。相反,在主线程上调用它们以保证在应用程序失去对 GPU 的访问权后永远不会调用它们。
因此,如果可以在后台调用 OpenGL ES 函数,那么如何确保在应用退出活动后它们永远不会被调用?