diff options
author | Michael Brasser <mbrasser@ford.com> | 2021-01-27 08:34:44 -0600 |
---|---|---|
committer | Tomi Korpipaa <tomi.korpipaa@qt.io> | 2021-03-25 17:49:05 +0200 |
commit | dbf08f32cd06ebf5ef4eeeb53fa5bab69bab57b3 (patch) | |
tree | 9d91d4db06ba39dc775c3efff474ac2426acb09f | |
parent | 68d8a192e21015b0e614e6a49667aabacba05d03 (diff) |
Do less work when there are no active ImageParticle particles
Don't mark geometry and material as dirty if there is nothing to change.
Task-number: QTBUG-41867
Change-Id: I016d2d76f4ebf731f5bfc931ba616ee5d074bc65
Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io>
Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
(cherry picked from commit e3cb305a6a19bf394c1068a7e483e1c95e11c22b)
-rw-r--r-- | src/particles/qquickimageparticle.cpp | 32 | ||||
-rw-r--r-- | src/particles/qquickimageparticle_p.h | 3 | ||||
-rw-r--r-- | src/particles/qquickparticlesystem_p.h | 2 |
3 files changed, 29 insertions, 8 deletions
diff --git a/src/particles/qquickimageparticle.cpp b/src/particles/qquickimageparticle.cpp index 4e850bfd4f..4c95fe6920 100644 --- a/src/particles/qquickimageparticle.cpp +++ b/src/particles/qquickimageparticle.cpp @@ -1132,6 +1132,7 @@ QQuickImageParticle::QQuickImageParticle(QQuickItem* parent) , m_startedImageLoading(0) , m_rhi(nullptr) , m_apiChecked(false) + , m_previousActive(false) { setFlag(ItemHasContents); } @@ -1960,11 +1961,13 @@ QSGNode *QQuickImageParticle::updatePaintNode(QSGNode *node, UpdatePaintNodeData } if (m_system && m_system->isRunning() && !m_system->isPaused()){ - prepareNextFrame(&node); + bool dirty = prepareNextFrame(&node); if (node) { update(); - foreach (QSGGeometryNode* n, m_nodes) - n->markDirty(QSGNode::DirtyGeometry); + if (dirty) { + foreach (QSGGeometryNode* n, m_nodes) + n->markDirty(QSGNode::DirtyGeometry); + } } else if (m_startedImageLoading < 2) { update();//To call prepareNextFrame() again from the renderThread } @@ -1978,7 +1981,7 @@ QSGNode *QQuickImageParticle::updatePaintNode(QSGNode *node, UpdatePaintNodeData return node; } -void QQuickImageParticle::prepareNextFrame(QSGNode **node) +bool QQuickImageParticle::prepareNextFrame(QSGNode **node) { if (*node == nullptr){//TODO: Staggered loading (as emitted) buildParticleNodes(node); @@ -1994,7 +1997,7 @@ void QQuickImageParticle::prepareNextFrame(QSGNode **node) qDebug() << "Total count: " << count; } if (*node == nullptr) - return; + return false; } qint64 timeStamp = m_system->systemSync(this); @@ -2015,8 +2018,23 @@ void QQuickImageParticle::prepareNextFrame(QSGNode **node) getState(m_material)->timestamp = time; break; } - foreach (QSGGeometryNode* node, m_nodes) - node->markDirty(QSGNode::DirtyMaterial); + + bool active = false; + for (auto groupId : groupIds()) { + if (m_system->groupData[groupId]->isActive()) { + active = true; + break; + } + } + + const bool dirty = active || m_previousActive; + if (dirty) { + foreach (QSGGeometryNode* node, m_nodes) + node->markDirty(QSGNode::DirtyMaterial); + } + + m_previousActive = active; + return dirty; } void QQuickImageParticle::spritesUpdate(qreal time) diff --git a/src/particles/qquickimageparticle_p.h b/src/particles/qquickimageparticle_p.h index 6eadfe10de..b040426a61 100644 --- a/src/particles/qquickimageparticle_p.h +++ b/src/particles/qquickimageparticle_p.h @@ -363,7 +363,7 @@ protected: void commit(int gIdx, int pIdx) override; QSGNode *updatePaintNode(QSGNode *, UpdatePaintNodeData *) override; - void prepareNextFrame(QSGNode**); + bool prepareNextFrame(QSGNode**); void buildParticleNodes(QSGNode**); void sceneGraphInvalidated() override; @@ -460,6 +460,7 @@ private: int m_startedImageLoading; QRhi *m_rhi; bool m_apiChecked; + bool m_previousActive; }; QT_END_NAMESPACE diff --git a/src/particles/qquickparticlesystem_p.h b/src/particles/qquickparticlesystem_p.h index bf3627edd7..1ef04d90c8 100644 --- a/src/particles/qquickparticlesystem_p.h +++ b/src/particles/qquickparticlesystem_p.h @@ -205,6 +205,8 @@ public: QString name(); + bool isActive() { return freeList.count() > 0; } + void setSize(int newSize); const ID index; |