Ho una semplice app di test OpenGL in C che disegna cose diverse in risposta all'input chiave. (Mesa 8.0.4, provato con Mesa-EGL e con GLFW, Ubuntu 12.04LTS su un PC con NVIDIA GTX650). I sorteggi sono abbastanza semplici / veloci (tipo di roba a triangolo rotante). Il mio codice di prova non limita deliberatamente il framerate in alcun modo, sembra solo questo:
while (true)
{
draw();
swap_buffers();
}
L'ho cronometrato con molta attenzione e trovo che il tempo che intercorre tra una eglSwapBuffers()
(o glfwSwapBuffers
, stessa cosa) chiamata successiva è di circa 16,6 millisecondi. Il tempo che intercorre tra una chiamata e eglSwapBuffers()
l'altra prima di quella successiva è solo un po 'meno, anche se ciò che viene disegnato è molto semplice. Il tempo impiegato dalla chiamata ai buffer di swap è inferiore a 1 ms.
Tuttavia, il tempo dall'app che cambia ciò che sta disegnando in risposta al tasto preme sulla modifica effettivamente visualizzata sullo schermo è> 150 ms (vale circa 8-9 frame). Questo viene misurato con una registrazione della fotocamera dello schermo e della tastiera a 60 fps.
Pertanto, le domande:
Dove sono memorizzati i sorteggi tra una chiamata per scambiare i buffer e mostrarli sullo schermo? Perché il ritardo? Sembra che l'app stia disegnando sempre più fotogrammi davanti allo schermo.
Cosa può fare un'applicazione OpenGL per provocare un disegno immediato sullo schermo? (ovvero: nessun buffering, basta bloccare fino al completamento dell'estrazione; Non ho bisogno di un throughput elevato, ho bisogno di una bassa latenza)
Cosa può fare un'applicazione per fare in modo che l'estrazione immediata di cui sopra avvenga il più velocemente possibile?
Come può un'applicazione sapere cosa è effettivamente sullo schermo in questo momento? (Oppure, quanto tempo / quanti frame è il ritardo di buffering corrente?)