我的应用程序执行快速渲染(通常每帧1-6毫秒),启用双缓冲并同步到vblank.在我的主循环,我要睡了大约10毫秒,然后看了一些实时输入并执行渲染尽可能晚地,同时还管理更新的截止时间(固体60 FPS的渲染以最小的延迟)之前的帧.
我可以在交换缓冲区之后使用glFinish但不幸的是在某些系统上(至少是Linux非合成),这似乎不仅要等到下一次缓冲区交换,而是等待图像被发送出HDMI端口(在该范围内总等待) 25毫秒,应用程序以30 FPS运行).在其他系统上(Linux编译),这种方法很好.没有glFinish更多的工作被缓冲,导致更长的延迟,所以这也不好.
我有什么选择可以获得更精确的帧定时?主要平台是Windows,Linux和OS X.
我想睡大约 10 毫秒,然后读取一些实时输入并尽可能晚地进行渲染,同时仍然设法在截止日期之前更新帧(以最小的延迟实现可靠的 60 FPS 渲染)。
这是一种非常不可靠的做法。我建议您将所有渲染操作放入它们自己的线程中,这将阻塞缓冲区交换,直到交换发生。在累积所有输入数据的单独线程中进行所有输入处理。在进行交换之前,您应该在处理线程上提升互斥体或信号量,这在缓冲区交换期间会起作用。
请记住,您不应该在非常接近垂直同步的情况下延迟渲染工具,因为这可能会导致您错过它。相反,您应该假设在垂直回扫间隔开始时有大约 75% 的时间用于渲染内容,而其余 25% 应保留作为紧急余量。另外,如果您正在运行合成器,则该合成器也需要一些 GPU 时间。
如果渲染早或晚,视觉结果没有区别。如果您担心模拟时序:只需假设您实际上会在截止日期前完成并渲染模拟在 V-Sync 时的状态。对模拟的任何数据输入使用卡尔曼滤波器,以便根据预测进行渲染并“仅”针对新输入进行调整。
我可以在交换缓冲区后使用 glFinish,但不幸的是,在某些系统(至少是 Linux 非合成系统)上,这似乎不仅要等到下一次缓冲区交换,还要等到图像从 HDMI 端口发送出去(总等待时间在范围内) 25 毫秒,应用程序以 30 FPS 运行)。
如果您的时序错过了垂直同步,就会发生这种情况:SwapBuffers 将等待一个完整的垂直回扫周期。恕我直言,SwapBuffers 应该添加某种超时参数,但到目前为止还没有。