Как использовать GLUT не в основном потоке на OS X? - PullRequest
1 голос
/ 29 января 2010

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

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

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

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

[править]

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

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

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

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

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

Ответы [ 3 ]

3 голосов
/ 29 января 2010

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

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

2 голосов
/ 03 февраля 2010

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

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

1 голос
/ 03 февраля 2010

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

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

...