Eu tenho um aplicativo de teste OpenGL simples em C, que desenha coisas diferentes em resposta às principais entradas. (Mesa 8.0.4, tentado com o Mesa-EGL e com o GLFW, Ubuntu 12.04LTS em um PC com NVIDIA GTX650). Os sorteios são bem simples / rápidos (tipo de triângulo rotativo). Meu código de teste não limita a taxa de quadros de forma alguma, apenas se parece com isso:
while (true)
{
draw();
swap_buffers();
}
Eu cronometrei isso com muito cuidado e acho que o tempo entre uma eglSwapBuffers()
(ou a glfwSwapBuffers
mesma coisa) chamada para a próxima é de ~ 16,6 milissegundos. O tempo de depois de uma chamada para eglSwapBuffers()
antes da próxima chamada é apenas um pouco menor que isso, mesmo que o que é desenhado seja muito simples. O tempo que a chamada dos buffers de troca demora é bem inferior a 1 ms.
No entanto, o tempo entre o aplicativo alterar o desenho, em resposta ao pressionamento de tecla e a alteração que realmente aparece na tela é> 150ms (aproximadamente 8 a 9 quadros). Isso é medido com uma gravação de câmera da tela e teclado a 60fps.
Portanto, as perguntas:
Onde os sorteios são armazenados em buffer entre uma chamada para trocar buffers e realmente aparecer na tela? Por que o atraso? Parece que o aplicativo está desenhando muitos quadros à frente da tela o tempo todo.
O que um aplicativo OpenGL pode fazer para causar um empate imediato na tela? (ou seja: sem buffer, apenas bloqueie até que o sorteio seja concluído; não preciso de alta taxa de transferência, preciso de baixa latência)
O que um aplicativo pode fazer para tornar o sorteio imediato acima o mais rápido possível?
Como um aplicativo pode saber o que realmente está na tela agora? (Ou quanto tempo / quantos quadros o atraso atual do buffer?)