我在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应用程序可以做什么以立即绘制屏幕?(即:无缓冲,仅阻塞直到绘制完成;我不需要高吞吐量,我需要低延迟)
应用程序可以做些什么来使上述立即抽奖尽快发生?
应用程序如何知道当前屏幕上实际显示的内容?(或者,当前缓冲延迟是几帧/几帧?)