我可以假设计划在串行队列上运行的块都将在同一个线程上运行吗?

时间:2011-03-27 00:38:27

标签: multithreading cocoa opengl grand-central-dispatch

我正在构建一个将使用OpenGL的Mac OS 10.6应用程序。我想将渲染转移到辅助调度队列(而不是主线程)。

据我所知,我需要使用线程局部OpenGL上下文来完成我的图形工作。我的计划是在第一个块上获取对它的引用,然后一遍又一遍地重复使用相同的实例。

但是,调度队列和线程不一样,Xcode 4的调试器显示队列可以使用多个线程。因此,我不确定我所做的事情是否安全(即使我相信只有并行队列可以使用多个线程)。

是否可以保证发送到串行队列的所有块都被发送到同一个线程?我应该改为获取当前的OpenGL上下文并在每帧时将其分配给NSOpenGLView吗?

4 个答案:

答案 0 :(得分:1)

每个线程不需要单独的OpenGL上下文。但OpenGL上下文一次只能在一个线程中处于活动状态。因此,您可以做的是在进入工作时使上下文处于活动状态,并在离开时停用它。

然而,多线程使用OpenGL通常会降低性能。无论如何,从OpenGL API调用者那里可以平行的是什么,因为操作的顺序非常重要。然而,GPU将完美地并行化所有操作。

所以我建议将所有OpenGL操作保存在一个线程中,并使用工作队列来处理I / O,用户交互,声音,模拟等。

答案 1 :(得分:1)

  

队列不受任何特定约束   执行线程

无法保证发送到串行队列的所有块都被发送到同一个线程。您需要使用主队列进行渲染,或者在使用NSThread或pthread作为主队列的GL上下文的线程上实现排队块。

答案 2 :(得分:1)

这里有一些关于OpenGL with GCD的更具体的信息:

http://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/ConcurrencyandOpenGLES/ConcurrencyandOpenGLES.html

  

GCD和NSOperationQueue对象可以在一个线程上执行你的任务   他们的选择。他们可以专门为该任务创建一个线程,   或者他们可以重用现有的线程。但在任何一种情况下,你都做不到   保证哪个线程执行任务。对于OpenGL ES   应用程序,这意味着:

     
      
  • 每个任务必须在执行任何OpenGL ES之前设置上下文   命令。
  •   
  • 您的应用程序必须确保访问的两个任务   不允许同时执行相同的上下文。
  •   
  • 每项任务都应该   退出前清除背景。
  •   

答案 3 :(得分:0)

不,对不起,没有保证。