【发布时间】:2014-02-16 09:15:10
【问题描述】:
我在 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()到就在下一次调用之前的时间仅比这少一点,尽管绘制的内容非常简单。交换缓冲区调用所需的时间远低于 1 毫秒。
但是,从应用更改其绘制内容以响应按键按下到更改实际显示在屏幕上的时间是 >150 毫秒(大约 8-9 帧)。这是通过以 60fps 的屏幕和键盘的摄像头记录来测量的。 (注意:确实,我没有办法测量从按键到应用程序获取它需要多长时间。我假设它是
因此,问题:
在调用交换缓冲区和实际显示在屏幕上之间,图形在哪里缓冲?为什么延迟?看起来该应用始终在屏幕前绘制许多帧。
OpenGL 应用程序可以做什么来立即在屏幕上绘制? (即:没有缓冲,只是阻塞直到绘制完成;我不需要高吞吐量,我需要低延迟)
应用程序可以做些什么来使上述立即绘制尽可能快地发生?
应用程序如何知道当前屏幕上实际显示的是什么? (或者,当前缓冲延迟有多长/多少帧?)
【问题讨论】:
标签: c opengl opengl-es 3d latency