Tengo una aplicación de prueba de OpenGL simple en C que dibuja cosas diferentes en respuesta a la entrada clave. (Mesa 8.0.4, probado con Mesa-EGL y con GLFW, Ubuntu 12.04LTS en una PC con NVIDIA GTX650). Los sorteos son bastante simples / rápidos (tipo de cosas de triángulo giratorio). Mi código de prueba no limita la velocidad de fotogramas deliberadamente de ninguna manera, simplemente se ve así:
while (true)
{
draw();
swap_buffers();
}
He cronometrado esto con mucho cuidado, y encuentro que el tiempo de una eglSwapBuffers()
(o la glfwSwapBuffers
misma) llamada a la siguiente es ~ 16.6 milisegundos. El tiempo desde después de una llamada hasta eglSwapBuffers()
justo antes de la próxima llamada es solo un poco menor que eso, aunque lo que se dibuja es muy simple. El tiempo que demora la llamada de las memorias intermedias de intercambio es muy inferior a 1 ms.
Sin embargo, el tiempo desde que la aplicación cambia lo que está dibujando en respuesta a la pulsación de la tecla al cambio que aparece en la pantalla es> 150 ms (aproximadamente 8-9 cuadros). Esto se mide con una grabación de la cámara de la pantalla y el teclado a 60 fps.
Por lo tanto, las preguntas:
¿Dónde se almacenan los sorteos entre una llamada para intercambiar buffers y aparecer en la pantalla? ¿Por qué la demora? Parece que la aplicación está dibujando muchos cuadros por delante de la pantalla en todo momento.
¿Qué puede hacer una aplicación OpenGL para provocar un sorteo inmediato en la pantalla? (es decir, sin almacenamiento en búfer, solo bloquee hasta que se complete el dibujo; no necesito un alto rendimiento, necesito una baja latencia)
¿Qué puede hacer una aplicación para que el sorteo inmediato anterior suceda lo más rápido posible?
¿Cómo puede una aplicación saber qué está realmente en la pantalla en este momento? (O, ¿cuánto tiempo / cuántos cuadros tiene el retraso de almacenamiento en búfer actual?)