gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 03:08:14 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com