QOpenGLWidget:以60FPS绘制,同时不干扰其现有时序

QOpenGLWidget: Drawing at 60FPS while not interfering with its existing timing?

本文关键字:干扰 60FPS 绘制 QOpenGLWidget      更新时间:2023-10-16

我正在使用C++,Qt和OpenGL编写着色器编辑器。 我希望渲染的场景是交互式的,并且我希望用户能够使用周围环境中的变量,如鼠标坐标或窗口尺寸。

就目前而言,每次基本上有任何类型的输入(鼠标移动,窗口聚焦,按键等)时,OpenGL小部件都会被重新绘制。 这就是Qt渲染的正常工作方式。

但是,我还想让用户使用定期更改的输入,其值不依赖于用户交互,例如系统时间、随机数,甚至可能还有网络摄像头。 为了以有意义的方式执行此操作,我必须定期更新屏幕(事实上,我可能会让用户自定义)。

如果用户输入触发渲染,而计时器也触发渲染,反之亦然,那么我将与竞争条件作斗争。 如何避免这种情况?

你可能需要一个渲染队列。每当用户或系统触发渲染时,您都会将其推送到队列中。然后,您将拥有一个渲染线程,该线程定期轮询队列以启动渲染。但是,我不明白这将如何成为竞争条件,因为无论更改了什么,对渲染的调用都应该更新屏幕。拥有队列还可以帮助您优化代码,因为您可以避免执行多个连续不必要的渲染调用。

使用 QTimer。这将在与其他更新事件相同的Qt线程上触发重绘事件,因此您无需担心竞争条件。例如,在 QOpenGLWidget 派生构造函数中:

auto pTimer = new QTimer(this);
connect(pTimer, &QTimer::timeout, this, &QOpenGLWidget::update); 
pTimer->start(1000 / 60.0);