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
risposta
IIRC questa estensione aiuta: http://www.opengl.org/registry/specs/SGI/video_sync.txt, ma è molto mal supportato con i driver correnti.
Purtroppo hai ragione, questa funzione è molto mal supportata. –
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.
Questo sarà specifico della piattaforma, se possibile. Quindi per favore specifica la tua piattaforma, taggando almeno. – unwind
Mi piacerebbe trovare un modo portabile per implementare questa funzione (Win32/Linux/MacOSX) –
come ti aiuta il ritardo fino al prossimo vsync? Non è come quando la chiamata swap fa lo scambio al momento della chiamata. – Bahbar