10

我想知道以固定的计时器间隔调用 updateGL() 是否会减慢渲染过程。所以,我想尝试实时渲染。我没有让它自动执行的功能。有人知道吗?

其次,我在我的程序中注释了 updateGL(),CPU 使用率降低到 1% 和 0%。现在,当我点击显示小部件时,它会跳到 14%,为什么?GPU不是在做所有的渲染工作吗?如果是,为什么 CPU 会跳到 14?我该如何解决这个问题?

4

1 回答 1

13

是的,您可以做到实时,没有撕裂(例如,以 60fps 的速度重绘,您的显示器的刷新率)。

为此,您必须启用 V_sync,并使用QTimer timer;间隔 0。启用 V_sync 将使swapBuffers()CPU 自动调用命令等待来自显示器的垂直刷新信号。然后,计时器实际上将与显示器刷新率同步。

相关信息可以在这里找到:https ://www.qt.io/blog/2010/12/02/velvet-and-the-qml-scene-graph 。如果您的驱动程序设置未自动完成,请注意QGLFormat::setSwapInterval(1)启用 V_sync:

class MyGLWidget: public QGLWidget
{
    // ...
private:
    QTimer timer;
}

QGLFormat desiredFormat()
{
    QGLFormat fmt;
    fmt.setSwapInterval(1);
    return fmt;
}

MyGLWidget::MyGLWidget() :
    QGLWidget(desiredFormat())
{
    // Configure the timer
    connect(&timer, SIGNAL(timeout()), this, SLOT(updateGL()));
    if(format().swapInterval() == -1)
    {
        // V_blank synchronization not available (tearing likely to happen)
        qDebug("Swap Buffers at v_blank not available: refresh at approx 60fps.");
        timer.setInterval(17);
    }
    else
    {
        // V_blank synchronization available
        timer.setInterval(0);
    }
    timer.start();
}

同时,您可以运行 aQElapsedTimer来测量两次绘图之间经过了多少时间(通常约为 16.6 毫秒),并使用此信息来更新您的场景,例如。

于 2013-06-18T11:18:36.823 回答