Representación multiproceso en OpenGL

Tengo una aplicación multiproceso, en la que bash renderizar con diferentes subprocesos. Primero intenté usar el mismo contexto de representación entre todos los hilos, pero estaba obteniendo contextos actuales NULL para otros hilos. He leído en Internet que un contexto solo puede estar actualizado en un hilo a la vez.

Entonces decidí hacer algo diferente. Creo una ventana, obtengo el HDC de él y creo el primer RC. Después de eso, comparto este HDC entre hilos, y en cada hilo nuevo que creo obtengo un nuevo RC del mismo HDC y lo actualizo para ese hilo. Cada vez que lo hago, el RC devuelto es siempre diferente (generalmente el valor anterior + 1). Hago una afirmación para verificar si wglGetCurrentContext() devuelve un RC, y parece que devuelve el que acaba de crearse. Pero después de hacer el renderizado, no obtengo ningún renderizado y si llamo GetLastError() error 6 (identificador no válido ??)

Entonces, ¿esto significa que, a pesar de que cada nueva llamada de wglCreateContext() me da un nuevo valor, de alguna manera significa que todos estos valores diferentes son el mismo “canal de conexión” a las llamadas de OpenGL?

¿Esto significa que siempre tendré que invalidar el contexto de representación anterior en un hilo, y activarlo en el nuevo? Realmente tengo que hacer esta sincronización todo el tiempo o ¿hay alguna otra forma de solucionar este problema?

Tengo una aplicación multiproceso, en la que bash renderizar con diferentes subprocesos.

¡NO!

No obtendrá nada al tratar de multirreproducir su procesador. Básicamente, te encuentras con una gran condición de carrera y el controlador estará ocupado sincronizando los hilos para darle sentido.

Para obtener el mejor rendimiento de representación, mantenga todas las operaciones de OpenGL en solo un hilo. Toda la paralelización ocurre de forma gratuita en la GPU.

Sugiero leer el siguiente artículo de la wiki del OpenGL Consortium.

http://www.opengl.org/wiki/OpenGL_and_multithreading

En palabras simples, depende mucho de lo que signifique para multi threading con respecto a OpenGl, si tiene un hilo haciendo la parte de renderizado y uno (o más) haciendo otros trabajos (es decir, AI, Física, lógica de juegos, etc.) es a la perfección

Si desea tener múltiples hilos jugando con OpenGL, no puede, o mejor, podría hacerlo, pero realmente le dará más problemas que ventajas.

Intente leer las siguientes preguntas frecuentes sobre el uso paralelo de OpenGL para tener una mejor idea sobre este concepto:

http://www.equalizergraphics.com/documentation/parallelOpenGLFAQ.html

En algunos casos, puede tener sentido utilizar múltiples contextos de representación en diferentes hilos. He utilizado un diseño de este tipo para cargar datos de imágenes desde el sistema de archivos e insertar estos datos en una textura.

OpenGL en Mac OS X es seguro para un solo hilo; para habilitarlo:

 #include  CGLError err = 0; CGLContextObj ctx = CGLGetCurrentContext(); // Enable the multi-threading err = CGLEnable( ctx, kCGLCEMPEngine); if (err != kCGLNoError ) { // Multi-threaded execution is possibly not available // Insert your code to take appropriate action } 

Ver: Concurrencia y OpenGL – Desarrollador de Apple

Y: Preguntas y respuestas técnicas QA1612: OpenGL ES multihilo y …