首页 > 解决方案 > 如何使用 QOpenGLWidget 实现近乎恒定的 FPS?

问题描述

我有子类QOpenGLWidget。我使用以下表面格式:

QSurfaceFormat format;
format.setSwapBehavior(QSurfaceFormat::DoubleBuffer);
format.setSwapInterval(2); // every 2nd vsync

使用这种表面格式我不必调用update(). 相反,Qt 会paintGL()以我的显示器刷新率 (60 Hz) 除以我的swapInterval(2) 来调用我。

所以理论上我应该得到一个恒定的 FPS=30。然而,当我测量这个时,FPS 变化很大:

在此处输入图像描述

paintGL()我在开始时测量时间std::chrono::high_resolution_clock::now(),找到自上次调用以来经过的毫秒数,paintGL()然后除以 1000 以获得 FPS。

我的paintGL()方法总是在不到 1 毫秒的时间内完成。我的 GPU 似乎几乎没有流汗: 在此处输入图像描述

尽管 CPU 2 和 4 的利用率出现了一些峰值,但我的 CPU 似乎也很好: 在此处输入图像描述

我可以做些什么来实现近乎恒定的 FPS QOpenGLWidget

顺便提一句。调用format.setSwapInterval()似乎没有任何效果。如果我尝试将 设置swapInterval为 1,则 FPS 仍会在 30 左右波动,而不是我预期的 60。

标签: c++qtopengl

解决方案


推荐阅读