我的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上,但不能公开访问。
答案 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);
就在那里。它不会一直闪烁,但是每隔很多次它就会使重绘与缓冲区交换不同步,从而导致闪烁。在我的应用程序中,绘图变得更加复杂和缓慢,闪烁更加糟糕。