c - 查找 OpenGL 垂直回扫时序

标签 c opengl

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

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

我有哪些选项可以实现更精确的帧计时?主要平台是Windows、Linux和OS X。

最佳答案

I want to sleep about 10 milliseconds, then read some real-time input and do the rendering as late as possible while still managing to update the frame before the deadline (for solid 60 FPS rendering with minimal latency).

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

请记住,您不应该在非常接近垂直同步的情况下延迟渲染工具,因为这可能会导致您错过它。相反,您应该假设在垂直回扫间隔开始时有大约 75% 的时间用于渲染内容,而其余 25% 应保留作为紧急余量。另外,如果您正在运行合成器,则该合成器也需要一些 GPU 时间。

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

I can use glFinish after swapping the buffers but unfortunately on some systems (Linux non-composited, at least) this appears to wait not only until the next buffer swap but until the image has been sent out the HDMI port (total wait in the range of 25 ms and application running at 30 FPS).

如果您的计时错过了垂直同步,就会发生这种情况:SwapBuffers 将等待一个完整的垂直回扫周期。恕我直言,SwapBuffers 应该添加某种超时参数,但到目前为止还没有。

关于c - 查找 OpenGL 垂直回扫时序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9865758/

相关文章:

c - C 中的对象数组

c++ - 我怎样才能在 OpenGL 片段着色器中制作这个球形渐变?

c++ - 如何使用 OpenGL 绘制 2D 图像

c - 在 window/openGL 上显示的图像已损坏

python - 如何在 2D 中正确平移和缩放?

c - 如何使用c显示字符 `£`?

c - 在 apache2 中重新编译 mod\module

c - Mikroc 中的函数声明

c - 使用C通过引用传递

opengl - PyOpenGL:glVertexPointer()偏移问题