2012-04-06 29 views
6

En una aplicación de Windows, tengo varias ventanas de OpenGL abiertas al mismo tiempo. Idealmente, me gustaría que cada uno de ellos dibuje a 60 fps, sincronizado con la actualización de la pantalla.Sincronización de varias ventanas de OpenGL a vsync

Para cada contexto de renderizado, llamo al wglSwapIntervalEXT(1) para activar vsync. Cada ventana tiene su propio hilo de visualización, que dibuja el cuadro y luego llama al SwapBuffers para actualizar.

Resulta que las ventanas se 'pelean' entre sí: parece que las llamadas SwapBuffers están sincronizadas y esperan una a la otra, aunque estén en hilos separados. Estoy midiendo el tiempo de fotograma a fotograma de cada ventana y con dos ventanas, esto baja a 30 fps, con de tres a 20 fps, etc.

Si desactivo el vsync con wglSwapIntervalEXT(0), se refrescan a los 60 fps no importa cuántas ventanas abro. Pero con una ventana abierta, esto no es tan fácil como con vsync activado.

¿Hay alguna manera de lograr lo que quiero con OpenGL?

+0

Si piensas en el problema, te darás cuenta de que tienen que sincronizarse entre sí si estás sincronizando todos ellos con la frecuencia de actualización. No hay un evento de actualización único para cada ventana que ve. La única solución en la que puedo pensar (casi con certeza que no arranca) es usar una ventana y hacer tu propio administrador de ventanas dentro de ella usando ventanas gráficas. – Robinson

+0

Si SwapBuffers simplemente indica que los búferes deben intercambiarse, podría volver inmediatamente (hasta que se escriba el nuevo búfer posterior, que debería bloquearse). Un subproceso independiente propiedad del controlador de pantalla podría esperar el vsync e intercambiar todos los búferes marcados como necesarios para intercambiar en el momento correcto. Sin embargo, aparentemente así no es como funcionan las cosas ... –

Respuesta

0

Es posible que pueda obtener el dispositivo de salida y utilizar la función WaitForVBlank en un bucle de un hilo. Eso puede publicar mensajes o eventos de señal para cada ventana que le interese.

+0

El problema es que no controlo las otras ventanas de OpenGL directamente. –

1

En Linux, se produjo un comportamiento extraño debido a llamadas de funciones de video de varios subprocesos.

Resolví estos problemas usando un hilo solo para mostrar desde el inicio de la aplicación, crear ventana, crear glcontext, etc., y usar semáforos y colas para compartir datos entre este hilo y los demás.

Cuestiones relacionadas