Saya memiliki aplikasi uji OpenGL sederhana dalam C yang menggambar berbagai hal sebagai respons terhadap input kunci. (Mesa 8.0.4, dicoba dengan Mesa-EGL dan dengan GLFW, Ubuntu 12.04LTS pada PC dengan NVIDIA GTX650). Gambarnya cukup sederhana / cepat (rotating triangle stuff of stuff). Kode pengujian saya tidak membatasi framerate dengan cara apa pun, hanya terlihat seperti ini:
while (true)
{
draw();
swap_buffers();
}
Saya telah menghitung waktu ini dengan sangat cermat, dan saya menemukan bahwa waktu dari satu eglSwapBuffers()
(atau glfwSwapBuffers
, hal yang sama) panggilan ke yang berikutnya adalah ~ 16,6 milidetik. Waktu dari setelah panggilan ke eglSwapBuffers()
sebelum panggilan berikutnya hanya sedikit kurang dari itu, meskipun apa yang diambil sangat sederhana. Waktu yang dibutuhkan panggilan swap buffer berada di bawah 1ms.
Namun, waktu dari aplikasi mengubah apa yang digambarkan sebagai respons terhadap penekanan tombol terhadap perubahan yang sebenarnya muncul di layar adalah> 150ms (sekitar 8-9 nilai bingkai). Ini diukur dengan rekaman kamera dari layar dan keyboard pada 60fps.
Karena itu, pertanyaannya:
Di mana drawed buffered antara panggilan untuk swap buffer dan benar-benar muncul di layar? Kenapa ditunda? Tampaknya aplikasi ini menggambar banyak bingkai di depan layar setiap saat.
Apa yang dapat dilakukan aplikasi OpenGL untuk menyebabkan undian langsung ke layar? (Yaitu: tidak ada buffering, cukup blok sampai draw selesai; Saya tidak perlu throughput tinggi, saya perlu latensi rendah)
Apa yang bisa dilakukan aplikasi untuk membuat penarikan langsung di atas secepat mungkin?
Bagaimana aplikasi mengetahui apa yang sebenarnya ada di layar sekarang? (Atau, berapa lama / berapa banyak frame penundaan buffering saat ini?)