如何在OS X上的主线程中不使用GLUT?

时间:2010-01-29 20:00:14

标签: macos opengl glut

我曾经尝试从子线程中打开一个GLUT窗口,并且遇到了许多令人讨厌的问题。我记得lists.apple.com上的这篇文章:

GLUT functions may only be called from the application's main thread

Mac OS X上的GLUT在这方面有什么变化吗?是否有线程安全的GLUT让你从任何线程打开窗口?

如果GLUT不是一个选项,是否有一个替换GLUT的小型库可以在任何线程中使用?

[编辑]

以下是我提出的各种解决方案触发的测试结果:

  • GLFW看起来不错,但没有编译(当前分支是3岁)
  • 琼脂是另一个伪装者,但它对于我的微小需求来说太大了
  • SDL不兼容BSD许可证,它是一个巨大的代码库,可以放在一个文件上
  • GLUT无法在任何线程中运行。

我决定重新发明轮子(是的,有时候这很好),最后一节只有200行代码。它让我打开并关闭任何线程的窗口(新线程中的openGL绘图)并且我可以完全控制垂直同步等(SDL使用双缓冲=对于openGL来说很慢)。我不得不围绕NSApp进行操作以正确启动和停止应用程序(否则不会使用事件循环)。

对于那些告诉我OpenGL不是线程安全的人来说,这并不完全正确:你可以运行多个OpenGL线程,并且draw命令将在分配给该线程的OpenGL状态下执行。 OpenGL 特定于线程

如果有人需要一些简单的代码来使用Cocoa创建OpenGL窗口:gl_window.mm

3 个答案:

答案 0 :(得分:3)

GLUT不是线程安全的。您需要使用您选择实施的任何解决方案来锁定基元。我建议在Cocoa中设置你自己的GL视图,并重写GLUT提供的管道。

看看SDL作为现代GLUT的替代品。它应该为您提供所需的所有跨平台。至于跨平台线程,Boost提供了一个可移植的library

答案 1 :(得分:2)

作为GLUT的替代品,请查看GLFW。它的目的和工作方式类似,但更好。并且它没有glfwMainLoop您的程序所坚持;它可以让你完全控制。从来没有发现GLFW我需要切换回GLUT。

请注意,GLFW 是线程安全的,因为从不同的线程(FAQ entry)调用GLFW函数是不安全的。但是,只要您从同一个线程调用所有GLFW函数,就可以选择哪个线程。

答案 2 :(得分:1)

GLUT不仅不是线程安全的,而且OpenGL是状态机,因此不是线程安全的。话虽如此,您可以拥有使用OpenGL的多线程应用程序。只需确保所有OpenGL调用都来自同一个线程。

Mac OS X上GLUT的下一步是Cocoa OpenGL Sample Code。这是一个真正的Cocoa应用程序,演示了使用Cocoa事件模型建立OpenGL窗口和交互性的Cocoa方法。从这个起点开始,在OpenGL绘图代码的单独线程(或线程)中添加代码来处理程序逻辑相当容易。