Однажды я попытался открыть окно 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