c++ - 使用 qt 和 opengl 显示图像,计时精度和 vsync 问题,c++

标签 c++ qt opengl rendering vsync

我正在构建一个应该以特定速率显示图像的模块(不是预先定义的,但不是很高 - 图像交换最大 10Hz)。

根据我的研究,我得出结论,在使用 openGL 调用(SwapInterval 系列)启用垂直同步后,QGLWidget 是完成此任务的正确工具。

但是,我不确定如何实际实现交换机制 - 我应该使用计时器吗?如果我将定时器设置为 333.3 毫秒(3 赫兹),当刷新率为 60 赫兹(每个周期 16.67,因此定时器为 20 个周期)时,我确定时间会好吗?如果速率应该是 9Hz,我需要将定时器设置为 100+16.67,因为这是我能得到的最好值? 如果计时器没问题,我应该在它向我发送超时事件时调用 paintGL() 吗?

谢谢

最佳答案

should I use a timer?

是的,但不是以天真的方式。如果您只是使用计时器来精确定位图像的呈现,您的计时器频率将为 beat针对显示垂直同步/刷新振荡器——程序定时器从与显示输出不同的时钟源运行。

这种跳动将导致错过交换间隔,这将被视为帧卡顿。

相反,您应该执行以下操作:使用垂直同步缓冲区交换 (SwapBuffers¹) 作为引用点来启动高精度时间测量计时器。

然后在您计划的 future 的下一个演示时间渲染帧;考虑到帧间隔以显示刷新间隔粒度出现——除非使用 G-Sync 或 FreeSync。使用 glFinish 强制完成帧渲染过程,然后停止计时器并确定渲染帧所用的时间。如果帧早于刷新周期完成,您的目标是添加一个(高分辨率延迟),将您的程序延迟到目标显示周期(目标是周期的中间),然后是 SwapBuffers 将作为下一次迭代的引用点。


¹:这仅适用于 Nvidia 和 AMD 卡及其专有驱动程序。 Intel GPU 的驱动程序具有不同的时序行为。

关于c++ - 使用 qt 和 opengl 显示图像,计时精度和 vsync 问题,c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41999427/

相关文章:

c++ - 如何在编译时排除单元测试

c++ - 如何在 Ubuntu 18.04.3 上将 "upgrade"转换为 OpenGL 3.3

c++ - QT自动保存截图带命名模板

c++ - 无法将 QMap 传递给 SLOT

c++ - QCache 没有方法插入

c++ - 如何在 OpenGL FBO 中使用多重采样

java - 使用 JOGL 进行全屏 Swing

c++ - C2664 将子类转换为模板父类时

c++ - 读入单词搜索游戏 C++ 的文件

c++ - 已经在 .obj 中定义,即使使用 #ifndef#define #endif