我想知道以固定的计时器间隔调用updateGL()是否会减慢渲染过程。所以,我想尝试实时渲染。我没有让它自动执行的函数。有人知道吗?
其次,我在我的程序中注释了updateGL(),CPU使用率减少到1%和0%。现在,当我点击display小部件时,它会跳到14%,为什么?不是所有的渲染工作都是GPU做的吗?如果是,为什么CPU会跳到14?我该如何解决这个问题?
发布于 2013-06-18 19:18:37
是的,你可以使它实时,没有撕裂(例如,重绘准确的60fps,您的显示器的刷新率)。
为此,您必须启用V_sync,并使用间隔为0的QTimer timer;。启用V_sync将使自动调用CPU的swapBuffers()命令等待来自监视器的垂直刷新信号。然后,计时器实际上将与监视器刷新率同步。
相关信息可以在这里找到:https://www.qt.io/blog/2010/12/02/velvet-and-the-qml-scene-graph。请注意启用V_sync的QGLFormat::setSwapInterval(1) (如果驱动程序设置未自动启用):
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();
}同时,您可以运行QElapsedTimer来测量两个绘图之间经过的时间(通常约为16.6ms),并使用此信息来更新场景。
https://stackoverflow.com/questions/17167194
复制相似问题