他们
suggest:
When using GCD,use a dedicated serial queue to dispatch commands to
OpenGL ES; this can be used to replace the conventional mutex pattern.
我不明白这个建议.我无法解决这种冲突:
当应用程序的app委托收到-applicationWillResignActive调用时,它必须立即停止调用任何OpenGL函数.
如果应用程序在-applicationWillResignActive返回后继续调用OpenGL函数,则应用程序将崩溃.
如果我遵循Apple的建议在串行后台队列中调用OpenGL函数,我面临着这个看似无法解决的问题:
1)收到-applicationWillResignActive后,我必须立即停止调用任何进一步的OpenGL函数.
2)但是因为串行队列正在处理后台代码块的过程中,有时代码块会在-applicationWillResignActive返回后完成执行,并且应用程序崩溃.
这是显示并发“块”的图示.主线程收到一个完整的停止消息,并且必须阻止进一步调用OpenGL ES.但不幸的是,这些发生在后台队列中,无法在块上工作时停止:
|_____main thread: "STOP calling OpenGL ES!"_____| _____|_____drawing queue: "Draw!"_____|_____drawing queue: "Draw!"_____|
从技术上讲,我发现无法立即停止后台队列,并避免在后台进一步调用OpenGL.一旦运行,提交的代码块将继续运行.
我找到的唯一解决方案是不在后台调用OpenGL ES函数.相反,在主线程上调用它们以保证在应用程序失去对GPU的访问权限之后永远不会调用它们.
解决方法
只需在applicationWillResignActive中等待队列使用调度组或类似机制完成所有排队操作.
您可以在documentation中找到一个示例:
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0); dispatch_group_t group = dispatch_group_create(); // Add a task to the group dispatch_group_async(group,queue,^{ // Some asynchronous work }); // Do some other work while the tasks execute. // When you cannot make any more forward progress,// wait on the group to block the current thread. dispatch_group_wait(group,DISPATCH_TIME_FOREVER); // Release the group when it is no longer needed. dispatch_release(group);