Как использовать GLUT не в основном потоке в OS X?

StackOverflow https://stackoverflow.com/questions/2164780

  •  24-09-2019
  •  | 
  •  

Вопрос

Однажды я попытался открыть окно GLUT из подпотока и столкнулся с множеством неприятных проблем. Я помню этот пост на lists.apple.com:

родовое слово

Изменилось ли что-нибудь в этом отношении с GLUT для Mac OS X? Есть ли поточно-ориентированный GLUT, который позволяет открывать окна из любого потока?

Если GLUT не подходит, есть ли крошечная библиотека, которая заменяет GLUT и будет работать из любого потока?

<▪[edit ]

Вот результат моих тестов, вызванных различными решениями, предложенными в качестве ответов:

  • GLFW выглядел хорошо, но не компилировался (текущей ветке 3 года)
  • Агар был еще одним претендентом, но он слишком велик для моей крошечной потребности.
  • SDL не совместим с лицензией BSD, и это огромная библиотека для кода, который должен уместиться в одном файле.
  • GLUT не может работать ни в одном потоке.

Я решил изобрести колесо (да, иногда это хорошо), и финальный класс состоит всего из 200 строк кода. Это позволяет мне открывать и закрывать окно из любого потока (openGL рисует в новом потоке), и у меня есть полный контроль над вертикальной синхронизацией и т.д. (SDL использует двойную буферизацию= медленное для openGL). Мне пришлось обмануть код NSApp, чтобы правильно запустить и остановить приложение (которое в противном случае не использует цикл событий).

Для тех, кто говорит мне, что OpenGL не является потокобезопасным, это не совсем так: вы можете запускать несколько потоков OpenGL, и команды рисования будут выполняться в состоянии OpenGL, назначенном этому потоку. OpenGL зависит от потока .

Если кому-то нужен простой код для создания окон OpenGL с использованием Какао: gl_window.mm

Это было полезно?

Решение

GLUT не является потокобезопасным.Вам понадобятся блокирующие примитивы с любым решением, которое вы решите реализовать.Я бы рекомендовал настроить собственное представление GL в Какао и переписать сантехнику, которую предоставляет GLUT.

Взгляните на SDL как на современную замену GLUT.Он должен дать вам всю необходимую кроссплатформенность.Что касается межплатформенной потоковой передачи, Boost предоставляет переносимую библиотеку .

Другие советы

В качестве замены GLUT ознакомьтесь с GLFW .Он похож по назначению и принципу работы, но лучше.И у него нет общего кодового кода, на котором застряла ваша программа;это дает вам полный контроль.С тех пор, как я обнаружил GLFW, у меня не было необходимости снова переключиться на GLUT.

Обратите внимание, что GLFW не потокобезопасен в том смысле, что вызывать функции GLFW из разных потоков небезопасно ( FAQ ).Однако, пока вы вызываете все функции GLFW из одного потока, вы сами выбираете, какой поток будет.

GLUT не только не является потокобезопасным, но OpenGL является конечным автоматом и, следовательно, не является потокобезопасным.При этом у вас могут быть многопоточные приложения, использующие OpenGL.Просто убедитесь, что все ваши вызовы OpenGL выполняются из одного потока.

Следующим шагом по сравнению с GLUT в Mac OS X является Cocoa.Образец кода OpenGL .Это настоящее приложение Какао, которое демонстрирует способ настройки окна OpenGL какао с интерактивностью с использованием модели событий Какао.С этой отправной точки довольно легко добавить код для обработки логики вашей программы в отдельный поток (или потоки) из кода рисования OpenGL.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top