Qt3DWindow中的双缓冲

时间:2019-04-08 08:04:38

标签: qt3d

我的Qt3DWindow在重绘时闪烁,感觉好像双重缓冲不能正常工作-我需要做些什么吗?

我尝试设置全局表面格式参数setSwapBehavior(QSurfaceFormat::DoubleBuffer),但似乎无济于事。我正在使用默认的QForwardRenderer,它被描述为渲染到后缓冲区中,但是我似乎无法控制缓冲区交换的时间

void SimulationWindow::initialiseScene()
{
    this->defaultFrameGraph()->setClearColor(m_backgroundColour);
    Qt3DCore::QEntity *rootEntity = new Qt3DCore::QEntity();
    this->setRootEntity(rootEntity);       
    Qt3DRender::QRenderSettings *renderSettings = this->renderSettings();        
    renderSettings->setRenderPolicy(Qt3DRender::QRenderSettings::OnDemand);
}

这是我对标准Qt3DWindow所做的唯一定制。使用QRenderSettings :: Always始终没有区别。我的感觉是,有一个可以通过QFrameGraphNode或QForwardRenderer访问的设置应该可以解决,或者有一种直接控制何时替换后缓冲区的方法。当然,这不仅会在我调用requestUpdate()时发生,这是我所期望的。或者也许我需要使用QForwardRenderer之外的其他东西来获得更多控制。

编辑:我发现了一个叫做Qt3DRender :: QNoDraw的东西,看起来很有希望。该文档中的建议是将它附加到QForwardRenderer的QClearBuffers上,但不能公开访问。

1 个答案:

答案 0 :(得分:1)

好的,我很确定我已经确切地找到了问题所在。我已经基于basicshapes-cpp示例创建了一个测试程序,其中一个形状与其他形状重叠,并且每0.5秒被删除并立即重绘一次。这一切都应该在后台缓冲区中发生,并且不应该看到,但实际上这会导致偶尔的闪烁。

main.cpp中的其他代码

view->renderSettings()->setRenderPolicy(Qt3DRender::QRenderSettings::OnDemand);
modifier->setView(view);
QTimer *timer = new QTimer(widget);
QObject::connect(timer, SIGNAL(timeout()), modifier, SLOT(timer()));
timer->start(500);

scenemodifier.cpp中的其他代码

void SceneModifier::timer()
{
    if (!m_torusEntity) return;
    delete m_torusEntity;

    // Torus shape data
    m_torus = new Qt3DExtras::QTorusMesh();
    m_torus->setRadius(1.0f);
    m_torus->setMinorRadius(0.4f);
    m_torus->setRings(100);
    m_torus->setSlices(20);

    // TorusMesh Transform
    Qt3DCore::QTransform *torusTransform = new Qt3DCore::QTransform();
    torusTransform->setScale(m_torusScale);
    torusTransform->setRotation(QQuaternion::fromAxisAndAngle(QVector3D(0.0f, 1.0f, 0.0f), 25.0f));
    torusTransform->setTranslation(QVector3D(5.0f, 4.0f, 0.0f));

    Qt3DExtras::QPhongMaterial *torusMaterial = new Qt3DExtras::QPhongMaterial();
    torusMaterial->setDiffuse(QColor(QRgb(0xbeb32b)));

    // Torus
    m_torusEntity = new Qt3DCore::QEntity(m_rootEntity);
    m_torusEntity->addComponent(m_torus);
    m_torusEntity->addComponent(torusMaterial);
    m_torusEntity->addComponent(torusTransform);

    m_view->requestUpdate();

}

scenemodifier.h中的其他代码

public slots:
    void timer();
    float m_torusScale = 4.0;
    Qt3DExtras::Qt3DWindow *m_view;
    void setView(Qt3DExtras::Qt3DWindow *view);

就在那里。它不会一直闪烁,但是每隔很多次它就会使重绘与缓冲区交换不同步,从而导致闪烁。在我的应用程序中,绘图变得更加复杂和缓慢,闪烁更加糟糕。

enter image description here