Mam prostą aplikację testową OpenGL w C, która rysuje różne rzeczy w odpowiedzi na kluczowe dane wejściowe. (Mesa 8.0.4, wypróbowany z Mesa-EGL i GLFW, Ubuntu 12.04LTS na PC z NVIDIA GTX650). Losowania są dość proste / szybkie (obracanie trójkątów). Mój kod testowy nie ogranicza celowo żadnej liczby klatek na sekundę, wygląda to tak:
while (true)
{
draw();
swap_buffers();
}
Zmierzyłem to bardzo dokładnie i stwierdziłem, że czas od jednego eglSwapBuffers()
(lub tego glfwSwapBuffers
samego) połączenia do następnego wynosi ~ 16,6 milisekund. Czas od połączenia do eglSwapBuffers()
momentu tuż przed następnym połączeniem jest tylko trochę mniejszy, mimo że losowanie jest bardzo proste. Czas potrzebny na wywołanie buforów wymiany jest znacznie poniżej 1ms.
Jednak czas od zmiany przez aplikację tego, co rysuje w odpowiedzi na naciśnięcie klawisza, na zmianę, która faktycznie pojawia się na ekranie, wynosi> 150 ms (wartość około 8-9 klatek). Jest to mierzone za pomocą kamery rejestrującej ekran i klawiaturę z prędkością 60 klatek na sekundę.
Dlatego pytania:
Gdzie losowane są buforowane między wezwaniem do zamiany buforów i faktycznie wyświetlane na ekranie? Skąd to opóźnienie? Wygląda na to, że aplikacja cały czas rysuje wiele ramek przed ekranem.
Co może zrobić aplikacja OpenGL, aby spowodować natychmiastowe wyświetlenie ekranu? (tj .: bez buforowania, po prostu blokuj do zakończenia losowania; nie potrzebuję dużej przepustowości, potrzebuję małego opóźnienia)
Co może zrobić aplikacja, aby powyższe natychmiastowe losowanie odbyło się tak szybko, jak to możliwe?
Skąd aplikacja może wiedzieć, co aktualnie jest wyświetlane na ekranie? (Lub jak długo / ile ramek jest bieżące opóźnienie buforowania?)