Ich habe eine einfache OpenGL-Test-App in C, die verschiedene Dinge als Reaktion auf Tasteneingaben zeichnet. (Mesa 8.0.4, getestet mit Mesa-EGL und mit GLFW, Ubuntu 12.04LTS auf einem PC mit NVIDIA GTX650). Die Draws sind recht einfach / schnell (rotierendes Dreieck). Mein Testcode schränkt die Framerate in keiner Weise absichtlich ein, er sieht einfach so aus:
while (true)
{
draw();
swap_buffers();
}
Ich habe dies sehr sorgfältig geplant und finde, dass die Zeit von einem eglSwapBuffers()
(oder glfwSwapBuffers
demselben) Anruf zum nächsten ~ 16,6 Millisekunden beträgt. Die Zeit von nach einem Anruf bis eglSwapBuffers()
kurz vor dem nächsten Anruf ist nur ein bisschen kürzer, obwohl das, was gezeichnet wird, sehr einfach ist. Die Zeit, die der Aufruf der Swap-Puffer benötigt, liegt deutlich unter 1 ms.
Die Zeit zwischen dem Ändern der Zeichnung der App als Reaktion auf den Tastendruck und der tatsächlich auf dem Bildschirm angezeigten Änderung beträgt jedoch> 150 ms (ca. 8-9 Frames). Dies wird mit einer Kameraaufnahme des Bildschirms und der Tastatur mit 60 fps gemessen.
Daher die Fragen:
Wo werden Draws zwischen einem Aufruf zum Austauschen von Puffern und dem tatsächlichen Anzeigen auf dem Bildschirm gepuffert? Warum die Verzögerung? Es sieht sicher so aus, als würde die App jederzeit viele Frames vor dem Bildschirm zeichnen.
Was kann eine OpenGL-Anwendung tun, um eine sofortige Auslosung auf dem Bildschirm zu bewirken? (dh: keine Pufferung, nur blockieren, bis das Zeichnen abgeschlossen ist; ich brauche keinen hohen Durchsatz, ich brauche eine niedrige Latenz)
Was kann eine Anwendung tun, um die oben genannte sofortige Auslosung so schnell wie möglich durchzuführen?
Wie kann eine Anwendung wissen, was gerade auf dem Bildschirm angezeigt wird? (Oder wie lang / wie viele Frames ist die aktuelle Pufferverzögerung?)