找到OpenGL垂直回扫时序

时间:2012-03-26 01:57:30

标签: c opengl

我的应用程序执行快速渲染(通常每帧1-6毫秒),启用双缓冲并同步到vblank。在我的主循环中,我想要睡眠大约10毫秒,然后读取一些实时输入并尽可能晚地进行渲染,同时仍然在截止日期之前更新帧(对于具有最小延迟的稳定60 FPS渲染)。 p>

我可以在交换缓冲区之后使用glFinish,但遗憾的是在某些系统上(至少是Linux非合成),这似乎不仅要等到下一个缓冲区交换,而是等待图像发送到HDMI端口(总等待)在25毫秒的范围内,应用程序以30 FPS运行)。在其他系统上(Linux编译),这种方法很好。如果没有glFinish,则会缓冲更多的工作,导致更长的延迟,因此这也不好。

我有哪些选项可以获得更精确的帧定时?主要平台是Windows,Linux和OS X.

1 个答案:

答案 0 :(得分:2)

  

我想要睡眠大约10毫秒,然后读取一些实时输入并尽可能晚地进行渲染,同时仍然在截止日期之前更新帧(对于具有最小延迟的稳定60 FPS渲染)。

这是一种非常不可靠的方法。我建议你把所有的渲染操作放到自己的线程中,这将阻塞缓冲区交换,直到交换发生。在一个单独的线程中进行所有输入处理,其中所有输入数据都是累计的。在进行交换之前,你应该在处理线程上提起互斥锁或信号量,这在缓冲区交换期间就是这样。

请记住,您不应该延迟渲染util非常接近V-Sync,因为这可能会导致您错过它。相反,你应该在垂直回扫间隔的开始时假定你提供你的东西的时间约为75%,而剩下的25%应该作为紧急保证金。此外,如果你正在运行一个合成器,那么这个也需要一些GPU时间。

如果你提前或晚期渲染,视觉结果没有区别。如果你担心你的模拟时间:假设你实际上已经完成截止日期并渲染模拟它在V-Sync时的状态。对模拟的任何数据输入使用Kalman filter,以便根据预测进行渲染,并“仅”调整新输入。

  

我可以在交换缓冲区之后使用glFinish,但遗憾的是在某些系统上(至少是Linux非合成),这似乎不仅要等到下一个缓冲区交换,而是等待图像发送到HDMI端口(总等待)在25毫秒范围内,应用程序以30 FPS运行。)

如果您的时序错过了V-Sync,则会发生这种情况:SwapBuffers将等待一个完整的垂直回扫期。 IMHO SwapBuffers应该添加某种超时参数,但到目前为止还没有。