他们 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.
我不明白这个建议。存在我无法解决的冲突:
当应用的应用委托(delegate)接收到 -applicationWillResignActive
调用时,它必须立即停止调用任何 OpenGL 函数。
如果应用在 -applicationWillResignActive
返回后继续调用 OpenGL 函数,应用将崩溃。
如果我按照 Apple 的建议在串行后台队列中调用 OpenGL 函数,我将面临这个看似无法解决的问题:
1) 在收到 -applicationWillResignActive
后,我必须立即停止调用任何进一步的 OpenGL 函数。
2) 但是因为串行队列正在后台处理一段代码,有时代码块会在 after
-applicationWillResignActive
返回时完成执行,应用程序崩溃。
这是显示并发“ block ”的插图。主线程收到一条完全停止消息,必须阻止对 OpenGL ES 的进一步调用。但不幸的是,这些发生在后台队列中,无法在处理 block 的过程中停止:
|_____main thread: "STOP calling OpenGL ES!"_____|
_____|_____drawing queue: "Draw!"_____|_____drawing queue: "Draw!"_____|
从技术上讲,我找不到立即停止后台队列并避免在后台进一步调用 OpenGL 的方法。提交的代码块一旦运行就会继续运行。
我找到的唯一解决方案是不在后台调用 OpenGL ES 函数。相反,在主线程上调用它们以确保在应用失去对 GPU 的访问权限后它们永远不会被调用。
那么如果可以在后台调用 OpenGL ES 函数,如何您如何确保在应用程序退出事件后,他们永远不会被调用?
最佳答案
只需在 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);
关于ios - 为什么 Apple 建议在串行后台队列中分派(dispatch) OpenGL 命令,因为这不可避免地会导致崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19741661/