Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
QOpenGLWidget:在不干扰其现有计时的情况下以60FPS的速度绘图? 我用C++、Qt和OpenGL编写了一个着色器编辑器。我希望渲染的场景是交互式的,我希望用户能够使用周围环境中的变量,如鼠标坐标或窗口尺寸_C++_Qt_Opengl_Frame Rate - Fatal编程技术网

QOpenGLWidget:在不干扰其现有计时的情况下以60FPS的速度绘图? 我用C++、Qt和OpenGL编写了一个着色器编辑器。我希望渲染的场景是交互式的,我希望用户能够使用周围环境中的变量,如鼠标坐标或窗口尺寸

QOpenGLWidget:在不干扰其现有计时的情况下以60FPS的速度绘图? 我用C++、Qt和OpenGL编写了一个着色器编辑器。我希望渲染的场景是交互式的,我希望用户能够使用周围环境中的变量,如鼠标坐标或窗口尺寸,c++,qt,opengl,frame-rate,C++,Qt,Opengl,Frame Rate,目前,每次基本上有任何类型的输入时,鼠标移动、窗口聚焦、按键等都会重新绘制OpenGL小部件。这就是Qt渲染的正常工作方式 然而,我也希望让用户使用定期变化的输入,其值不依赖于用户交互,比如系统时间、随机数,甚至可能是网络摄像头。为了以一种有意义的方式做到这一点,我必须定期更新屏幕,事实上,我可能会让用户自定义 如果用户输入触发了渲染,而计时器也触发了渲染,或者反之亦然,那么我将与比赛条件进行斗争。如何避免这种情况?您可能需要一个渲染队列。每当用户或系统触发渲染时,您都会将其推入队列。然后,您将

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

然而,我也希望让用户使用定期变化的输入,其值不依赖于用户交互,比如系统时间、随机数,甚至可能是网络摄像头。为了以一种有意义的方式做到这一点,我必须定期更新屏幕,事实上,我可能会让用户自定义


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

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

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

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

不完全是我要找的。我不需要队列,因为现在每个渲染调用都将渲染相同的场景。我想这更像是一个Qt/OpenGL问题,而不是一个一般的渲染问题。我不理解这个问题。你问:如果用户输入触发了渲染,而计时器也触发了渲染,或者反之亦然,那么我将与比赛条件搏斗。我如何避免这种情况?。在处理竞争条件时,无论上下文如何,都需要使用不可变结构、线程安全结构或围绕线程不安全调用的锁。在你的问题中,我看不到它有任何特定于QT/OpenGL的问题;我没有显式地使用线程,尽管我毫不怀疑计时器会。根据比赛条件,如果用户的鼠标移动触发了渲染,而在一个叫做渲染的计时器中间,如果用户输入触发一个渲染,而一个定时器也一样,反之亦然,那么我将与竞赛条件进行角力。你为什么这么认为?每当场景所依赖的内容发生变化时,只需更新gl小部件即可。这会将更新事件发布到事件队列中,并且这些事件会被压缩,因此无论您调用update的频率有多高,一旦事件循环恢复控制,将只有一次重新渲染。易于理解的如果您要求其他内容,请使用相关详细信息或代码更新问题。渲染场景-在哪里?在QGLWidget或QOpenGLWidget上,或者?