У мене є простий тестовий додаток 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 для негайного малювання на екрані? (тобто: не буферизація, просто блокуйте, поки малюнок не завершиться; мені не потрібна висока пропускна здатність, мені потрібна низька затримка)
Що може зробити програма, щоб зробити вищезазначене негайне розіграш якнайшвидше?
Як програма може знати, що саме зараз є на екрані? (Або скільки часу / скільки кадрів становить поточна затримка буферизації?)