我正在构建一个将使用OpenGL的Mac OS 10.6应用程序。我想将渲染转移到辅助调度队列(而不是主线程)。
据我所知,我需要使用线程局部OpenGL上下文来完成我的图形工作。我的计划是在第一个块上获取对它的引用,然后一遍又一遍地重复使用相同的实例。
但是,调度队列和线程不一样,Xcode 4的调试器显示队列可以使用多个线程。因此,我不确定我所做的事情是否安全(即使我相信只有并行队列可以使用多个线程)。
是否可以保证发送到串行队列的所有块都被发送到同一个线程?我应该改为获取当前的OpenGL上下文并在每帧时将其分配给NSOpenGLView
吗?
答案 0 :(得分:1)
每个线程不需要单独的OpenGL上下文。但OpenGL上下文一次只能在一个线程中处于活动状态。因此,您可以做的是在进入工作时使上下文处于活动状态,并在离开时停用它。
然而,多线程使用OpenGL通常会降低性能。无论如何,从OpenGL API调用者那里可以平行的是什么,因为操作的顺序非常重要。然而,GPU将完美地并行化所有操作。
所以我建议将所有OpenGL操作保存在一个线程中,并使用工作队列来处理I / O,用户交互,声音,模拟等。
答案 1 :(得分:1)
队列不受任何特定约束 执行线程
无法保证发送到串行队列的所有块都被发送到同一个线程。您需要使用主队列进行渲染,或者在使用NSThread或pthread作为主队列的GL上下文的线程上实现排队块。
答案 2 :(得分:1)
这里有一些关于OpenGL with GCD的更具体的信息:
GCD和NSOperationQueue对象可以在一个线程上执行你的任务 他们的选择。他们可以专门为该任务创建一个线程, 或者他们可以重用现有的线程。但在任何一种情况下,你都做不到 保证哪个线程执行任务。对于OpenGL ES 应用程序,这意味着:
- 每个任务必须在执行任何OpenGL ES之前设置上下文 命令。
- 您的应用程序必须确保访问的两个任务 不允许同时执行相同的上下文。
- 每项任务都应该 退出前清除背景。
答案 3 :(得分:0)
不,对不起,没有保证。