ios - 为什么 Apple 建议在串行后台队列中分派(dispatch) OpenGL 命令,因为这不可避免地会导致崩溃?

标签 ios opengl-es concurrency grand-central-dispatch

他们 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/

相关文章:

ios - 为什么我的用户位置总是在中心?

ios - AutoLayout 和 AVCaptureVideoPreviewLayer

opengl-es - 如何在 GLSL ES 中确定纹理的偶数/奇数线

ios - 如何快速从 HealthKit 获取血氧饱和度?

ios - 尝试在其 View 不在窗口层次结构中的 firstController 上呈现 <UINavigationController>

opengl-es - OpenGL绘制矩形轮廓

java - OpenGL ES 2.0 和动态 VBO

Bash:如何简单地并行化任务?

java - Java 中的持久阻塞队列?

java - dk.brics.automaton 包线程安全吗?