如何在QT中实现updateGL()实时

Sam*_*Sam 9 c++ opengl qt

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

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

Bor*_*ein 12

是的,你可以实时,没有撕裂(例如,重新绘制正好60fps,你的显示器的刷新率).

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

相关信息可在此处找到:http://blog.qt.digia.com/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();
}
Run Code Online (Sandbox Code Playgroud)

同时,您可以运行a QElapsedTimer来测量两次绘图之间经过的时间(通常约为16.6ms),并使用此信息来更新场景.