J'ai une application de test OpenGL simple en C qui dessine différentes choses en réponse à une entrée clé. (Mesa 8.0.4, essayé avec Mesa-EGL et avec GLFW, Ubuntu 12.04LTS sur un PC avec NVIDIA GTX650). Les tirages sont assez simples / rapides (type de truc en triangle tournant). Mon code de test ne limite pas le framerate délibérément, il ressemble à ceci:
while (true)
{
draw();
swap_buffers();
}
J'ai chronométré cela très soigneusement, et je trouve que le temps d'un appel eglSwapBuffers()
(ou de la glfwSwapBuffers
même chose) au suivant est d'environ 16,6 millisecondes. Le temps qui s'écoule entre un appel et eglSwapBuffers()
juste avant le prochain appel n'est que légèrement inférieur, même si ce qui est dessiné est très simple. Le temps nécessaire à l'appel des tampons d'échange est bien inférieur à 1 ms.
Cependant, le temps écoulé entre l'application qui change ce qu'elle dessine en réponse à la pression de la touche et le changement qui apparaît réellement à l'écran est> 150 ms (valeur d'environ 8 à 9 images). Ceci est mesuré avec un enregistrement par caméra de l'écran et du clavier à 60 images par seconde.
Par conséquent, les questions:
Où les tirages sont-ils mis en mémoire tampon entre un appel à échanger des tampons et apparaître réellement à l'écran? Pourquoi le retard? Il semble que l'application dessine à tout moment de nombreuses images devant l'écran.
Que peut faire une application OpenGL pour provoquer un tirage immédiat à l'écran? (c'est-à-dire: pas de mise en mémoire tampon, juste bloquer jusqu'à ce que le tirage soit terminé; je n'ai pas besoin d'un débit élevé, j'ai besoin d'une faible latence)
Que peut faire une application pour que le tirage immédiat ci-dessus se produise le plus rapidement possible?
Comment une application peut-elle savoir ce qui est actuellement affiché à l'écran? (Ou, combien de temps / combien d'images le délai de mise en mémoire tampon actuel est-il?)