SDL 2.0: создать окно в основном потоке, но сделать весь рендеринг в отдельном

Это моя текущая настройка: я делаю рендеринг OpenGL с использованием SDL (в настоящее время на Linux). Я инициализирую SDL (SDL_Init) и создаю окно приложения (SDL_CreateWindow) в основном потоке и передаю его во второй поток. Этот второй поток создает из него контекст OpenGL (SDL_GL_CreateContext) и запускает цикл рендеринга, в то время как основной поток прослушивает события. Я думаю, важно отметить, что вызовы GL полностью ограничены этой второй нитью; на самом деле большая часть моей логики приложения существует там, основной поток действительно ответственен только за обработку событий, которые входят в SDL.

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

Должны ли я беспокоиться о том, что это не будет работать в OSX/Windows? На Linux у меня не было вообще никакого. Там много информации в Интернете о совместном использовании контекста и выполнении вызовов GL из нескольких потоков, но все, что я хочу сделать, это сделать OpenGL в одном потоке, который не является основным. Я не хотел бы продолжать кодировать свое приложение, чтобы потом узнать, что он больше не будет работать.

Ответы

Ответ 1

У меня есть приложение, которое работает на Mac/iOS/Windows, которое структурировано таким образом (все GL в потоке рендеринга), но я не использую SDL.

Я просто посмотрел SDL Cocoa_GL_CreateContext (называемый SDL_GL_CreateContext на OS X), и он делает вызовы, которые я делаю из основного потока, чтобы настроить контекст.

Итак, если вы столкнулись с какими-либо проблемами, попробуйте создать контекст GL в основном потоке и затем передать это в поток рендеринга (вместо создания контекста GL в потоке рендеринга).

Ответ 2

OpenGL и многопоточность являются в основном врагами: только один поток может "владеть контекстом визуализации" в любой момент - да, вы можете переключать контекст визуализации GL всякий раз, когда потоки переключаются, но думают о стоимости, а также считают, что из один драйвер OEM к другому, он не очень поддерживается и может работать для некоторых людей, а не для других. Единственная логическая (и разумная) альтернатива - это сохранить все ваши вызовы OpenGL в один поток (обратите внимание: есть исключения, есть вещи, которые любой поток может вызывать в gl, связанные с потоковыми данными, без необходимости их собственного контекста визуализации), К сожалению, мы не можем просто передать GL-контекст вокруг потоков, как было предложено, мы должны вызвать (w) glMakeCurrent, который сообщает GL "этот поток вызывающего пользователя теперь вам принадлежит", но не сообщает другие потоки, которые...