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?
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
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 ... –