2010-02-08 15 views
6

Estoy buscando una forma portátil de hacer un SwapBuffers sin bloqueo() incluso si VSync está activado.
En otras palabras, ¿es posible recibir una notificación por un evento o conocer la demora hasta la próxima VSync?SwapBuffers sin bloqueo() con VSync = en

+0

Esto va a ser específico de la plataforma, si es posible. Por lo tanto, especifique su plataforma, etiquetando al menos. – unwind

+0

Me gustaría encontrar una forma portátil de implementar esta característica (Win32/Linux/MacOSX) –

+0

¿De qué manera la demora hasta la próxima vsync lo ayuda? No es como si la llamada swapbuffer hiciera el intercambio en el momento de la llamada. – Bahbar

Respuesta

0

En primer lugar, ¿por qué no simplemente llama a SwapBuffers() al comienzo del cuadro? O de alguna manera cambiar la tubería para

Render(); 
    Update(); //Update before swapping buffers 
    SwapBuffers(); 

Mientras OpenGL está trabajando lejos en todos los comandos que acaba de lanzar en él, usted puede hacer todo de su lógica de actualización.

De lo contrario, hay algunas maneras de solucionar este problema.

Sé que XNA tiene una propiedad ScanLine, que le dice qué línea de exploración está actualmente ocupando la pantalla. No sé si OpenGL expone esto también, pero estoy bastante seguro de que debe hacerlo. (¿Correcto?)

Utilice la representación de subprocesos múltiples. Muchos motores modernos dedican un hilo completo solo para renderizar. Si bloquea, está bien, no molesta al hilo principal. Alternativamente, una forma más sencilla es manejar la entrada, etc. en un nuevo hilo, esto evita complicaciones con los contextos gráficos.

Use triple buffering. Usar triple buffering significa que tienes 2 buffers de respaldo. Después de llamar a SwapBuffers, la pantalla puede continuar escaneando el buffer frontal, con el búfer recién terminado esperando, y el tercer búfer para que represente el siguiente fotograma. Por supuesto, si ya ha procesado dos fotogramas, se bloqueará SwapBuffers().