windows multithreading macos opengl sdl

windows - SDL 2.0: Crear ventana en el hilo principal, pero hacer todo el renderizado en un hilo separado



multithreading macos (2)

OpenGL y multihilo son básicamente enemigos: solo un hilo puede ''ser dueño del contexto de renderizado'' en un momento dado. Sí, puedes cambiar el contexto de renderizado GL siempre que los hilos cambien, pero piensa en el costo y también considera que, desde un controlador OEM para el siguiente, no está bien respaldado y es probable que funcione para algunas personas y no para otras. La única alternativa lógica (y sensata) es mantener todas sus llamadas OpenGL a un hilo (nota: hay excepciones, hay cosas que cualquier hilo puede invocar en gl, relacionadas con la transmisión de datos, sin que ellos necesiten tener un contexto de representación) . Desafortunadamente, no podemos simplemente pasar el contexto GL alrededor de los subprocesos como se sugiere, debemos llamar a (w) glMakeCurrent, que le dice a GL "este hilo que llama ahora te pertenece", pero falla al decir otros hilos que ...

Esta es mi configuración actual: estoy haciendo un renderizado OpenGL usando SDL (actualmente en Linux). Inicializo SDL ( SDL_Init ) y creo la ventana de la aplicación ( SDL_CreateWindow ) en el hilo principal y la paso a un segundo hilo. Este segundo hilo crea un contexto OpenGL a partir de él ( SDL_GL_CreateContext ) e inicia un ciclo de renderizado, mientras que el hilo principal escucha los eventos. Creo que es importante tener en cuenta que las llamadas GL están completamente confinadas a este segundo hilo; de hecho, la mayor parte de la lógica de mi aplicación se produce allí, el hilo principal es realmente el único responsable del manejo de los eventos que llegan a través de SDL.

Originalmente, hice esto al revés, pero resulta que no se pueden procesar eventos en otra cosa que no sea el hilo principal en OSX y probablemente también Windows, así que lo cambié para ser compatible con esos dos en el futuro.

¿Debería preocuparme de que esto no funcione en OSX / Windows? En Linux, no he tenido absolutamente nada. Hay mucha información en Internet sobre el uso compartido de contexto y la realización de llamadas GL desde múltiples hilos, pero todo lo que quiero hacer es hacer OpenGL en un hilo que no sea el principal. No me gustaría continuar codificando mi aplicación solo para luego descubrir que no funcionará en ningún otro lado.


Tengo una aplicación que se ejecuta en Mac / iOS / Windows que está estructurada de esta manera (todo GL en un hilo de renderizado), pero no uso SDL.

Acabo de echar un vistazo al Cocoa_GL_CreateContext de SDL (llamado por SDL_GL_CreateContext en OS X) y hace las llamadas que hago desde mi hilo principal para configurar el contexto.

Por lo tanto, si tiene algún problema, intente crear el contexto GL en el hilo principal y luego pase eso al hilo de representación (en lugar de crear el contexto GL en el hilo de representación).