【发布时间】:2012-03-14 08:35:48
【问题描述】:
我正在将 OpenGL 应用程序从 win32 项目移植到 Qt 项目。
在 win32 项目中,我只是有一个主循环,它会在上一帧完成后立即执行下一帧。
在我找到的关于 Qt 和 OpenGL 的教程中,他们使用计时器来控制场景的更新。但是,我想尽可能频繁地渲染帧 - 怎么做?
【问题讨论】:
-
为什么要渲染尽可能多的帧?您确定只渲染监视器可以显示的帧数还不够吗?通常是每秒 60 帧。
我正在将 OpenGL 应用程序从 win32 项目移植到 Qt 项目。
在 win32 项目中,我只是有一个主循环,它会在上一帧完成后立即执行下一帧。
在我找到的关于 Qt 和 OpenGL 的教程中,他们使用计时器来控制场景的更新。但是,我想尽可能频繁地渲染帧 - 怎么做?
【问题讨论】:
但是,我希望尽可能频繁地渲染帧 - 怎么做?
不适用于 Qt。 Qt 完全控制了事件循环,因此不会为您提供任何直接执行空闲操作的方法。在 Qt 中执行空闲操作的标准方法是使用超时为 0 的 QTime。
另一种可能性是使用第二个线程仅用于 OpenGL 操作。但是,为了可靠地工作,您应该为该线程创建一个专用的 OpenGL 上下文。
Qt 根本不适合那些主循环的主要任务是渲染图片而输入和事件管理只是次要的程序。
【讨论】:
QApplication.exec_() 采用事件循环。应该有一种方法可以使用QApplication.processEvents() 来设置典型的渲染循环。我在这方面取得了一些成功,当我解决一些松散的问题时我会发布。
尝试在绘制处理程序结束时调用 update()。
这将使另一个重绘事件排队。
【讨论】:
Qt 和 OpenGL 的内在原则不是尽快渲染,而是随时随地我们想要渲染(巨大的差异)。
您必须询问系统最大帧速率(在 OpenGL 中搜索示例,对不起,我不记得在哪里看到的)。完成此操作后,只需根据此最大帧速率创建一个计时器,即可获得所需的内容。
【讨论】:
但是,我想尽可能频繁地渲染帧 - 怎么做?
使用带零的 QTimer interval。
【讨论】: