【问题标题】:QTimer for QGLWidget, incorrect drawing and timing on other machinesQGLWidget的QTimer,在其他机器上绘制和计时不正确
【发布时间】:2013-02-22 21:15:53
【问题描述】:

我有两个计时器来重绘 QGLWidget 并确定 FPS

QObject::connect(&fpsTimer, SIGNAL(timeout()), this, SLOT(updateFps()));
fpsTimer.start(1000);

QObject::connect(&updateTimer, SIGNAL(timeout()), this, SLOT(updatePanel()));
updateTimer.start(0);


void GLPanel::updatePanel()
{
    updateBuffers();
    updateGL();
    frameCount++;
}

我还在每一帧都用新数据更新 vbos。

在我安装了 Qt 的机器上,我获得了一致的 60 FPS,因为更新计时器将根据 GUI 线程触发。我尝试将其设置为每 15 毫秒更新一次,而不是依靠 GUI 线程而没有运气。在其他机器上,它会加速到大约 1000 FPS。

我遇到的另一个问题是我的点在其他机器上没有正确绘制。它们被绘制在错误的位置和颜色。至于这是和Qt有关还是和OpenGL有关……?

有什么想法会导致这种情况吗?

点击屏幕中间后的其他机器 Other machines

点击一个点后工作的开发机器 Working Dev Machine

它们应该看起来完全一样。

【问题讨论】:

    标签: c++ qt opengl opengl-3


    【解决方案1】:

    您的绘图计时器使用 0 毫秒的间隔。所以程序试图尽可能快地绘制。这就是为什么其他计算机具有非常高的帧速率。您的计算机很可能正在使用显示驱动程序的vsync 设置。 Vsync 会将绘图与显示器的刷新率同步,这就是 60 Hz 帧率的原因。因此,您可以使用垂直同步设置将其他计算机的帧速率限制为 60。

    但是,一些旧的和便宜的显卡根本不支持垂直同步。然后您需要更改计时器的时间间隔,例如更改为 15 毫秒。它不会产生像垂直同步那样好的结果,但它比以 1000 Hz 绘制要好得多。

    【讨论】:

    • 我已经尝试将计时器间隔设置为 15 毫秒,但没有任何区别,仍然将 FPS 最大化。
    • 这应该是不可能的。您是否尝试过其他间隔值,例如 100 和 1000?
    • 实际上它正在工作,它只比我想象的快 10 FPS。所以当我期待大约 60 FPS 时,我得到了大约 70 FPS。我想这并不重要,但 FPS 会高于 66.667 而不是更低,超时时间为 15 毫秒,这似乎很奇怪。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    • 1970-01-01
    • 2017-07-14
    • 2017-07-01
    • 2016-05-13
    • 2017-03-26
    相关资源
    最近更新 更多