OpenGL实际更新屏幕需要多长时间?

Ale*_*x I 9 c opengl 3d latency opengl-es

我在C中有一个简单的OpenGL测试应用程序,它根据键输入绘制不同的东西.(Mesa 8.0.4,在带有NVIDIA GTX650的PC上试用了Mesa-EGL和GLFW,Ubuntu 12.04LTS).绘制非常简单/快速(旋转三角形类型的东西).我的测试代码不会故意以任何方式限制帧速率,它看起来像这样:

while (true)
{
    draw();
    swap_buffers();
}
Run Code Online (Sandbox Code Playgroud)

我非常小心地计时,我发现从一个eglSwapBuffers()(或glfwSwapBuffers)调用到下一个的时间是~16.6毫秒.从时间调用eglSwapBuffers()之前的下一次调用比只少一点点,即使什么画是很简单的.交换缓冲区调用的时间远低于1ms.

但是,从应用程序更改其响应按键的绘制时间到实际显示在屏幕上的更改的时间大于150毫秒(大约8-9帧).这是通过以60fps的屏幕和键盘的相机记录来测量的.(注意:确实,我没有办法测量从按键到应用程序获取它需要多长时间.我假设它是<< 150ms).

因此,问题:

  1. 在调用交换缓冲区和实际显示在屏幕之间的图形缓冲在哪里?为何延误?看起来应用程序看起来总是在屏幕前方绘制许多帧.

  2. OpenGL应用程序可以做什么来立即绘制屏幕?(即:没有缓冲,只是阻止直到绘制完成;我不需要高吞吐量,我确实需要低延迟)

  3. 应用程序可以做些什么来尽快实现上述即时抽奖?

  4. 应用程序如何才能知道屏幕上实际显示的内容?(或者,当前缓冲延迟的时间长度/帧数是多少?)

Pra*_*ndh 1

  • 在调用交换缓冲区和实际显示在屏幕上之间,图形在哪里缓冲?为什么延迟?看起来该应用程序确实始终在屏幕前面绘制许多帧。

该命令将排队,无论绘制到后备缓冲区的是什么,都会等到下一个垂直同步(如果您已设置),swapInterval并且在下一个垂直同步时,应显示该缓冲区。

  • OpenGL 应用程序可以做什么来立即绘制到屏幕上?(即:没有缓冲,只是阻塞直到绘制完成;我不需要高吞吐量,我确实需要低延迟)

使用glFinish可以确保在此 API 返回之前绘制所有内容,但除了 swapInterval 设置之外,无法控制它何时实际到达屏幕。

  • 应用程序可以做什么来使上述立即绘制尽快发生?应用程序如何知道屏幕上现在实际显示的是什么?(或者,当前缓冲延迟是多长/多少帧?)

一般来说,您可以使用同步(类似http://www.khronos.org/registry/egl/extensions/NV/EGL_NV_sync.txt)来找出这一点。

您确定测量延迟的方法正确吗?如果您的 PC 中的按键输入实际上有明显的延迟怎么办?您是否测量过从代码中收到事件到交换缓冲区之后的延迟?