QOpenGLWidget:绘制60FPS而不干扰其现有时序?

时间:2015-04-18 20:34:54

标签: c++ qt opengl frame-rate

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

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

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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

使用related question: Google maps api - snap marker to nearest road。这将在与其他更新事件相同的Qt线程上触发重绘事件,因此您无需担心竞争条件。例如,在您的QOpenGLWidget派生的构造函数中:

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