2012-04-06 27 views
6

In un'applicazione Windows, sono aperte più finestre OpenGL contemporaneamente. Idealmente vorrei che ognuno di questi disegnasse a 60 fps, sincronizzati con l'aggiornamento dello schermo.Sincronizzazione di più finestre OpenGL su vsync

Per ogni contesto di rendering, sto chiamando wglSwapIntervalEXT(1) per attivare vsync. Ogni finestra ha il proprio thread di visualizzazione, che disegna il frame e quindi chiama SwapBuffers per l'aggiornamento.

Si scopre che le finestre si "combattono" l'una con l'altra: sembra che le chiamate SwapBuffers siano sincronizzate e si aspettino a vicenda, anche se sono in thread separati. Sto misurando il tempo di frame-to-frame di ciascuna finestra e con due finestre, questo scende a 30 fps, da tre a 20 fps, ecc.

Se si spegne vsync con wglSwapIntervalEXT(0), si aggiornano allegramente a 60 fps, non importa quante finestre apro. Ma con una finestra aperta, questo non è così liscio come con vsync attivato.

C'è un modo per ottenere ciò che voglio con OpenGL?

+0

Se pensi al problema, ti renderai conto che devono sincronizzarsi l'un l'altro se si stanno sincronizzando tutti con la frequenza di aggiornamento. Non c'è un evento di aggiornamento univoco per ogni finestra che vedi. L'unica soluzione che riesco a pensare (che è quasi certamente una non-starter) è usare una finestra e creare il proprio window manager all'interno di essa usando le finestre. – Robinson

+0

Se SwapBuffers segnalasse semplicemente che i buffer devono essere scambiati, potrebbe tornare immediatamente (fino a quando non viene scritto il nuovo buffer di back, che dovrebbe essere bloccato). Un thread separato di proprietà del driver di visualizzazione potrebbe quindi attendere il vsync e scambiare tutti i buffer contrassegnati come need-to-swap nel momento corretto. Tuttavia, apparentemente questo non è il modo in cui funzionano le cose ... –

risposta

0

Potrebbe essere possibile ottenere il dispositivo di uscita e utilizzare la funzione WaitForVBlank in un ciclo da un thread. Questo può quindi postare messaggi o segnalare eventi per ogni finestra che ti interessa.

+0

Il problema è che non controllo direttamente le altre finestre di OpenGL. –

1

In Linux si sono verificati molti strani comportamenti nelle mie applicazioni a causa del richiamo di funzioni video da vari thread.

Ho risolto questi problemi utilizzando un solo thread per la visualizzazione dall'inizio dell'applicazione, creare la finestra, creare glcontext, ecc. E utilizzare i semafori e le code per condividere i dati tra questo thread e gli altri.