如何减少OpenGl的延迟?

时间:2020-02-14 15:10:32

标签: c++ windows qt opengl qopenglwidget

我编写了一个小应用程序,该应用程序将光标替换为手绘光标。因此,我使用了QOpenGlWidget。 对于动画,我使用frameSwapped信号:

connect(this, SIGNAL(frameSwapped()), this, SLOT(update()));

到现在为止,我还没有使用任何特定的OpenGl函数,因此我只是将paintevent类比替代了经典的QWidget。

Qt documentation

仅使用QPainter执行绘图时,还可以像对普通小部件一样执行绘画:通过重新实现paintEvent()。

void Widget::paintEvent(QPaintEvent* event) {


    // Draw Cursor
    POINT LpPoint;
    GetCursorPos(&LpPoint);
    QPoint CursorPos(LpPoint.x, LpPoint.y);
    CursorPos = mapFromGlobal(CursorPos);
    QPainter Painter(this);
    Painter.drawEllipse(CursorPos, 20, 20);


}

我以240 fps的速度拍摄了结果,并意识到绘制的光标在Windows光标之后2帧。不存在任何延迟并不重要。但是只有一帧会很棒。如果我能够量化滞后,那就太好了。这样我就知道这是一帧+-渲染的持续时间。我已经读过this,但对OpenGl不太熟悉。而且我不认为我可以在QOpenGlWidget中使用它。也许有人对如何将延迟减少到只有一个Frame有了想法。

更新1 : 我做了一些研究,并尝试了很多,并取得了一定的成功。 我的最新版本:

connect(this, SIGNAL(frameSwapped()), this, SLOT(animate()));
void Widget::animate() {
    makeCurrent();
    QOpenGLFunctions* f = QOpenGLContext::currentContext()->functions();
    f->glFinish();
    //std::this_thread::sleep_for(std::chrono::milliseconds(12));
    update();
}

我使用glFinish()同步CPU和GPU。现在绘制的光标大约落后一帧。有时甚至比一帧还要好。但是有跳过的帧,因此绘制的光标根本不会移动。总体而言,没有一致性。我仍然有些麻烦,无法确切了解OpenGl如何更新。也许更多信息:setIntervall设置为1,并且它是双缓冲的。我认为也许不知道Qt到底做什么是个问题。调用update仅调度更新,而我无法控制如何交换缓冲区。也许有人在这些问题上有更多的经验。我可以说paintevent / paintGL每16毫秒调用一次。我添加了std::this_thread::sleep_for(std::chrono::milliseconds(12));,以减少渲染和实际鼠标位置之间的延迟。这有助于减少平均延迟。但是对我而言,几乎不可能对下一帧将要发生的情况做出可靠的预测。

更新2: 我在Qt forum上发布了类似的问题。即使不是直接答案,它也包含一些有用的信息。

0 个答案:

没有答案
相关问题