我曾经尝试从子线程中打开一个GLUT窗口,并且遇到了许多令人讨厌的问题。我记得lists.apple.com上的这篇文章:
GLUT functions may only be called from the application's main thread
Mac OS X上的GLUT在这方面有什么变化吗?是否有线程安全的GLUT让你从任何线程打开窗口?
如果GLUT不是一个选项,是否有一个替换GLUT的小型库可以在任何线程中使用?
[编辑]
以下是我提出的各种解决方案触发的测试结果:
我决定重新发明轮子(是的,有时候这很好),最后一节只有200行代码。它让我打开并关闭任何线程的窗口(新线程中的openGL绘图)并且我可以完全控制垂直同步等(SDL使用双缓冲=对于openGL来说很慢)。我不得不围绕NSApp
进行操作以正确启动和停止应用程序(否则不会使用事件循环)。
对于那些告诉我OpenGL不是线程安全的人来说,这并不完全正确:你可以运行多个OpenGL线程,并且draw命令将在分配给该线程的OpenGL状态下执行。 OpenGL 特定于线程。
如果有人需要一些简单的代码来使用Cocoa创建OpenGL窗口:gl_window.mm
答案 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绘图代码的单独线程(或线程)中添加代码来处理程序逻辑相当容易。