У меня есть простое тестовое приложение OpenGL на C, которое рисует разные вещи в ответ на ввод ключа. (Mesa 8.0.4, пробовал с Mesa-EGL и с GLFW, Ubuntu 12.04LTS на ПК с NVIDIA GTX650). Ничья довольно простая / быстрая (вращающийся треугольник). Мой тестовый код никоим образом не ограничивает частоту кадров, он просто выглядит так:
while (true)
{
draw();
swap_buffers();
}
Я очень тщательно рассчитал время и обнаружил, что время от одного eglSwapBuffers()
(или того glfwSwapBuffers
же) вызова до следующего составляет ~ 16,6 миллисекунды. Время от после звонка eglSwapBuffers()
до следующего звонка лишь немного меньше этого, хотя то, что нарисовано, очень просто. Время, которое занимает вызов буферов подкачки, значительно меньше 1 мс.
Тем не менее, время от приложения, изменяющего то, что оно рисует в ответ на нажатие клавиши, до изменения, фактически отображаемого на экране, составляет> 150 мс (приблизительно 8-9 кадров). Это измеряется записью экрана и клавиатуры с частотой 60 кадров в секунду.
Поэтому вопросы:
Где находятся буферизованные отрисовки между вызовом для замены буферов и фактическим отображением на экране? Почему задержка? Похоже, приложение всегда рисует много кадров впереди экрана.
Что может сделать приложение OpenGL, чтобы вызвать немедленный вывод на экран? (т.е.: нет буферизации, просто блокируйте, пока не завершится отрисовка; мне не нужна высокая пропускная способность, мне нужна низкая задержка)
Что может сделать приложение, чтобы вышеуказанная немедленная ничья произошла как можно быстрее?
Как приложение может узнать, что на самом деле сейчас на экране? (Или как долго / сколько кадров составляет текущая задержка буферизации?)