2010-02-08 13 views
6

Sto cercando un modo portatile per creare uno SwapBuffer() non bloccante anche se VSync è attivato.
In altre parole, è possibile essere avvisati da un evento o conoscere il ritardo fino al prossimo VSync?SwapBuffers non bloccanti() con VSync = on

+0

Questo sarà specifico della piattaforma, se possibile. Quindi per favore specifica la tua piattaforma, taggando almeno. – unwind

+0

Mi piacerebbe trovare un modo portabile per implementare questa funzione (Win32/Linux/MacOSX) –

+0

come ti aiuta il ritardo fino al prossimo vsync? Non è come quando la chiamata swap fa lo scambio al momento della chiamata. – Bahbar

risposta

0

In primo luogo, perché non si chiama SwapBuffers() all'inizio del frame? O in qualche modo cambiare la pipeline per

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

Mentre OpenGL funziona via a tutti i comandi che appena gettato a esso, si può fare tutta la tua logica di aggiornamento.

Altrimenti ci sono alcuni modi per risolvere questo problema.

So che XNA ha una proprietà ScanLine, che indica quale scanline lo schermo è attualmente in grado di. Non so se OpenGL esponga anche questo, ma sono abbastanza sicuro che sia necessario. (Destra?)

Usa rendering multithread. Molti motori moderni dedicano un'intera discussione solo per il rendering. Se blocca, va bene, non disturba il thread principale. In alternativa, un modo più semplice è semplicemente gestire l'input, ecc. Su un nuovo thread, evitando così complicazioni con i contesti grafici.

Utilizzare triple buffering. L'uso del buffering triplo significa che hai 2 buffer posteriori. Dopo aver chiamato SwapBuffers, lo schermo può continuare a scansionare il buffer frontale, con il buffer appena finito in attesa e il terzo buffer per il rendering del fotogramma successivo. Ovviamente, se hai già eseguito il prerendering di due frame, SwapBuffers() verrà bloccato.

Problemi correlati