Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 如何在OSX上使用不在主线程中的GLUT?_Macos_Opengl_Glut - Fatal编程技术网

Macos 如何在OSX上使用不在主线程中的GLUT?

Macos 如何在OSX上使用不在主线程中的GLUT?,macos,opengl,glut,Macos,Opengl,Glut,我曾经试图从一个子线程打开一个过剩窗口,结果遇到了很多棘手的问题。我记得lists.apple.com上的这篇帖子: GLUT functions may only be called from the application's main thread 在这方面,Mac OS X的过剩有什么改变吗?是否存在线程安全过剩,允许您从任何线程打开窗口 如果GLUT不是一个选项,那么是否有一个小型库可以替代GLUT并从任何线程工作 [编辑] 以下是我的测试结果,这些测试由作为答案的各种解决方案触发:

我曾经试图从一个子线程打开一个过剩窗口,结果遇到了很多棘手的问题。我记得lists.apple.com上的这篇帖子:

GLUT functions may only be called from the application's main thread
在这方面,Mac OS X的过剩有什么改变吗?是否存在线程安全过剩,允许您从任何线程打开窗口

如果GLUT不是一个选项,那么是否有一个小型库可以替代GLUT并从任何线程工作

[编辑]

以下是我的测试结果,这些测试由作为答案的各种解决方案触发:

  • GLFW看起来不错,但没有编译(当前分支已有3年历史)
  • 阿加尔是另一个伪装者,但它太大了,无法满足我的小小需求
  • SDL与BSD许可证不兼容,它是一个庞大的代码库,可以容纳在单个文件中
  • GLUT不能在任何线程中运行
我决定重新发明轮子(是的,有时这很好),最终的类只有200行代码。它让我可以从任何线程(openGL在新线程中绘制)打开和关闭窗口,我可以完全控制垂直同步等(对于openGL,SDL使用双缓冲=慢速)。我必须绕过
NSApp
来正确启动和停止应用程序(否则不会使用事件循环)

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


如果有人需要一些基本代码来使用Cocoa创建OpenGL窗口:

GLUT不是线程安全的。无论您选择实现什么样的解决方案,都需要锁定原语。我建议您在Cocoa中设置自己的GL视图,并重写GLUT提供的管道


看看现代过剩的替代品。它应该为您提供您想要的所有跨平台功能。就跨平台线程而言,Boost提供了可移植的。GLUT不是线程安全的。无论您选择实现什么样的解决方案,都需要锁定原语。我建议您在Cocoa中设置自己的GL视图,并重写GLUT提供的管道


看看现代过剩的替代品。它应该为您提供您想要的所有跨平台功能。就跨平台线程而言,Boost提供了一种便携的解决方案。

作为GLUT的替代品,请看一看。它的用途和工作原理相似,但更好。而且它没有你的程序被卡住的
glfwMainLoop
;它允许你完全控制。自从我发现GLFW后,我就再也没有必要回到过剩状态


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

作为GLUT的替代,请查看。它的用途和工作原理相似,但更好。而且它没有你的程序被卡住的
glfwMainLoop
;它允许你完全控制。自从我发现GLFW后,我就再也没有必要回到过剩状态


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

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


Mac OS X上过剩的下一步是。这是一个真正的Cocoa应用程序,它演示了设置OpenGL窗口的Cocoa方法,并使用Cocoa事件模型进行交互。从这一点出发,添加代码以在OpenGL绘图代码的单独线程(或多个线程)中处理程序逻辑相当容易。

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


Mac OS X上过剩的下一步是。这是一个真正的Cocoa应用程序,它演示了设置OpenGL窗口的Cocoa方法,并使用Cocoa事件模型进行交互。从这一点开始,在OpenGL绘图代码之外的单独线程(或多个线程)中添加代码来处理程序逻辑相当容易。

所有代码都必须在Mac、Windows和Linux上运行。如果有一个管道工能帮我省去重写过量代码的痛苦,那就太好了。所有代码都必须在Mac、Windows和Linux上运行。如果有一个管道工能让我省去重写过量等价物的痛苦,那就太好了。GLFW看起来不错,但稳定的分支已经有3年历史了,并且没有编译(大量的弃用警告和错误)。现在(如果不是10年前)由于OSX中的限制,一些重要的GLFW函数(如glfwCreateWindow)只有在从OSX上的主线程调用时才能正常工作。GLFW手册记录了哪些功能仅限于主线程。您仍然可以从其他线程调用它们,它将在某些操作系统(例如Windows、Linux)上工作,但在OSX上不起作用。不幸的是,GLFW看起来不错,但稳定的分支已有3年历史,并且没有编译(大量的弃用警告和错误)。现在(如果不是在'10年)由于OSX中的限制,一些重要的GLFW函数(如glfwCreateWindow)只有在从OSX上的主线程调用时才能正常工作。GLFW手册记录了哪些功能仅限于主线程。您仍然可以从其他线程调用它们,并且它可以在某些操作系统(例如Windows、Linux)上工作,但在OSX上不起作用。