C tuş girdisine yanıt olarak farklı şeyler çizen basit bir OpenGL test uygulamam var. (Mesa 8.0.4, Mesa-EGL ve GLFW, Ubuntu 12.04LTS ile NVIDIA GTX650 yüklü bir bilgisayarda çalıştı). Çekilişler oldukça basit / hızlı (dönen üçgen tipi şeyler). Test kodum kare hızını kasıtlı olarak herhangi bir şekilde sınırlamaz, sadece şöyle görünür:
while (true)
{
draw();
swap_buffers();
}
Bunu çok dikkatli bir şekilde zamanladım ve bir eglSwapBuffers()
(veya glfwSwapBuffers
aynı şey) çağrısından diğerine kadar geçen sürenin ~ 16.6 milisaniye olduğunu görüyorum . Bir çağrıdan eglSwapBuffers()
sonraki bir sonraki çağrıya kadar geçen süre, çizilen şey çok basit olsa da, bundan biraz daha azdır. Takas arabelleklerinin çağrıldığı süre 1 ms'nin altındadır.
Bununla birlikte, uygulamadan tuşa basmakla çizdiklerini değiştiren , ekranda gösterilen değişikliğe kadar geçen süre> 150 ms'dir (yaklaşık 8-9 kare değerinde). Bu, 60fps'de ekranın ve klavyenin kamera kaydı ile ölçülür.
Bu nedenle, sorular:
Arabellekleri değiştirmek için yapılan bir çağrı ile gerçekte ekranda gösterilmek üzere arabellekler nerede bulunur? Gecikme sebebi? Uygulama her zaman ekranın önünde birçok kare çiziyor gibi görünüyor.
Bir OpenGL uygulaması derhal ekrana çekmek için ne yapabilir? (yani: tamponlama yok, sadece çizim tamamlanana kadar engelle; Yüksek verime ihtiyacım yok, düşük gecikmeye ihtiyacım var)
Bir uygulama yukarıdaki acil çekilişi olabildiğince hızlı yapmak için ne yapabilir?
Bir uygulama şu anda ekranda ne olduğunu nasıl bilebilir? (Ya da, geçerli arabelleğe alma gecikmesinin kaç kare / kaç kare olduğu?)