키 입력에 대한 응답으로 다른 것을 그리는 C에 간단한 OpenGL 테스트 앱이 있습니다. (Mesa 8.0.4, NVIDIA GTX650이 설치된 PC에서 Mesa-EGL 및 GLFW, Ubuntu 12.04LTS로 시도) 추첨은 매우 간단하고 빠릅니다 (삼각형의 회 전형). 내 테스트 코드는 어떤 식 으로든 프레임 속도를 의도적으로 제한하지 않으며 다음과 같이 보입니다.
while (true)
{
draw();
swap_buffers();
}
나는 이것을 매우 신중하게 시간을 정했고, 한 번 eglSwapBuffers()
(또는 glfwSwapBuffers
같은 것)에서 다음 번까지의 시간 은 ~ 16.6 밀리 초라는 것을 알았습니다 . 전화가 끝나고 eglSwapBuffers()
다음 전화가되기 직전 까지 걸리는 시간은 그 내용이 매우 단순하지만 그보다 약간 적습니다. 스왑 버퍼 호출에 걸리는 시간은 1ms 미만입니다.
그러나 앱이 키를 누르면 화면에 실제로 나타나는 변경에 대한 응답으로 그림이 바뀌는 시간 은> 150ms (약 8-9 프레임 가치)입니다. 이것은 60fps에서 화면과 키보드의 카메라 녹화로 측정됩니다.
따라서 질문 :
스왑 버퍼 호출 사이에 드로우가 어디에 버퍼링되고 실제로 화면에 표시됩니까? 왜 지연? 앱이 항상 화면보다 많은 프레임을 그리는 것처럼 보입니다.
OpenGL 응용 프로그램으로 화면을 즉시 그릴 수있는 방법은 무엇입니까? (즉 : 버퍼링 없음, 그리기가 완료 될 때까지 막기; 높은 처리량이 필요없고 낮은 대기 시간이 필요합니다)
위의 즉각적인 추첨을 가능한 빨리하기 위해 응용 프로그램은 무엇을 할 수 있습니까?
응용 프로그램은 현재 화면에 실제로 무엇이 있는지 어떻게 알 수 있습니까? (또는 현재 버퍼링 지연이 얼마나 오래 / 얼마나 많은 프레임입니까?)