QOpenGLWidget:以60FPS绘制,同时不干扰其现有时序
QOpenGLWidget: Drawing at 60FPS while not interfering with its existing timing?
我正在使用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);
相关文章:
- AddDllDirectory会干扰后续的LoadLibraryExW
- DropBox 会干扰 DeleteFile()/rename() 吗?
- 构造函数干扰成员变量指定的初始值设定项?
- C++ 无效双指针干扰另一个
- 以 60fps 的速度流式传输 Logitec C922,C++
- 来自不同翻译单元的函数会干扰吗?
- 如何在忽略C++中的干扰词的同时解析用户输入?
- 如何在 Win32 应用中拖动纯色矩形,而不会产生白色闪烁,也不会干扰其他屏幕对象
- 自动收报机中断会干扰硬件中断吗?
- 在功能方面遇到了一些问题,以及它们如何干扰Main
- 干扰矢量在GlBegin()中
- 正确读取被ID3标签干扰的MP3文件
- GetAsyncKeyState() - 外部程序会干扰它
- 干扰GETLINE功能的东西
- QOpenGLWidget:以60FPS绘制,同时不干扰其现有时序
- 如果二进制运算符+重载的返回值是const,它会干扰优化吗
- std::unique_ptr 干扰某些 sf::RenderWindow 函数
- 如何识别AVL树中的干扰节点
- Sentinel干扰在c++中查找最小值
- 为什么 glDrawElements 在使用相同的缓冲区进行计算着色和渲染时会干扰 glGetBufferSubData