0

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

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

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

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

4

4 回答 4

1

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

然而,OpenGL 的多线程使用通常会降低性能。无论如何,OpenGL API 调用方可以并行化的东西很少,因为操作的顺序非常重要。然而,GPU 将完美地并行化所有操作。

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

于 2011-03-28T09:10:13.920 回答
1

队列不绑定到任何特定的执行线程

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

于 2011-04-01T02:51:19.050 回答
1

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

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

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

  • 每个任务必须在执行任何 OpenGL ES 命令之前设置上下文。
  • 您的应用程序必须确保访问同一上下文的两个任务不允许同时执行。
  • 每个任务都应该在退出之前清除上下文。
于 2012-07-03T09:37:30.180 回答
0

不,对不起,没有保证。

于 2011-03-27T01:13:33.977 回答