aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSadegh Taghavi <Sadegh.Taghavi@qt.io>2024-02-28 10:38:11 +0200
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2024-03-09 12:52:45 +0000
commitcd64942d4542a19f20c647d5c37f60b82937f8dc (patch)
tree9f7fcb13c977b74914c7df0a184044cfe9f570d8
parenta57e772eadc8e3edbb00f91ed1c92cdf73eafbec (diff)
Fix ItemParticle constant CPU usage
Takes particleSystem enabled and running states and particleItem enabled and its parent enabled into account with some connections Fixes: QTBUG-117923 Pick-to: 6.5 Change-Id: I3921759cf09a3aea2b8bfa51f847c5a909bb534b Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io> (cherry picked from commit c6fad0e79ec7768e1bbd852dd85a594e4318f8f7) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> (cherry picked from commit 3fbca326e5bd4c0fabec79bfc7ff7439b30fc2d0)
-rw-r--r--src/particles/qquickitemparticle.cpp59
-rw-r--r--src/particles/qquickitemparticle_p.h8
2 files changed, 63 insertions, 4 deletions
diff --git a/src/particles/qquickitemparticle.cpp b/src/particles/qquickitemparticle.cpp
index cd48095b18..f6d352d478 100644
--- a/src/particles/qquickitemparticle.cpp
+++ b/src/particles/qquickitemparticle.cpp
@@ -94,7 +94,11 @@ QQuickItemParticle::QQuickItemParticle(QQuickItem *parent) :
{
setFlag(QQuickItem::ItemHasContents);
clock = new Clock(this);
- clock->start();
+ connect(this, &QQuickItemParticle::systemChanged, this, &QQuickItemParticle::reconnectSystem);
+ connect(this, &QQuickItemParticle::parentChanged, this, &QQuickItemParticle::reconnectParent);
+ connect(this, &QQuickItemParticle::enabledChanged, this, &QQuickItemParticle::updateClock);
+ reconnectSystem(m_system);
+ reconnectParent(parent);
}
QQuickItemParticle::~QQuickItemParticle()
@@ -230,9 +234,10 @@ QSGNode* QQuickItemParticle::updatePaintNode(QSGNode* n, UpdatePaintNodeData* d)
if (m_pleaseReset)
m_pleaseReset = false;
- prepareNextFrame();
-
- update();//Get called again
+ if (clockShouldUpdate()) {
+ prepareNextFrame();
+ update(); //Get called again
+ }
if (n)
n->markDirty(QSGNode::DirtyMaterial);
return QQuickItem::updatePaintNode(n,d);
@@ -285,6 +290,52 @@ QQuickItemParticleAttached *QQuickItemParticle::qmlAttachedProperties(QObject *o
return new QQuickItemParticleAttached(object);
}
+bool QQuickItemParticle::clockShouldUpdate() const
+{
+ QQuickItem *parentItem = qobject_cast<QQuickItem *>(parent());
+ return (m_system && m_system->isRunning() && !m_system->isPaused() && m_system->isEnabled()
+ && ((parentItem && parentItem->isEnabled()) || !parentItem) && isEnabled());
+}
+
+void QQuickItemParticle::reconnectParent(QQuickItem *parentItem)
+{
+ updateClock();
+ disconnect(m_parentEnabledStateConnection);
+ if (parentItem) {
+ m_parentEnabledStateConnection = connect(parentItem, &QQuickParticleSystem::enabledChanged,
+ this, &QQuickItemParticle::updateClock);
+ }
+}
+
+void QQuickItemParticle::reconnectSystem(QQuickParticleSystem *system)
+{
+ updateClock();
+ disconnect(m_systemRunStateConnection);
+ disconnect(m_systemPauseStateConnection);
+ disconnect(m_systemEnabledStateConnection);
+ if (system) {
+ m_systemRunStateConnection = connect(m_system, &QQuickParticleSystem::runningChanged, this, [this](){
+ QQuickItemParticle::updateClock();
+ });
+ m_systemPauseStateConnection = connect(m_system, &QQuickParticleSystem::pausedChanged, this, [this](){
+ QQuickItemParticle::updateClock();
+ });
+ m_systemEnabledStateConnection = connect(m_system, &QQuickParticleSystem::enabledChanged, this,
+ &QQuickItemParticle::updateClock);
+ }
+}
+
+void QQuickItemParticle::updateClock()
+{
+ if (clockShouldUpdate()) {
+ if (!clock->isRunning())
+ clock->start();
+ } else {
+ if (clock->isRunning())
+ clock->pause();
+ }
+}
+
QT_END_NAMESPACE
#include "moc_qquickitemparticle_p.cpp"
diff --git a/src/particles/qquickitemparticle_p.h b/src/particles/qquickitemparticle_p.h
index cec3432c46..acb40d8769 100644
--- a/src/particles/qquickitemparticle_p.h
+++ b/src/particles/qquickitemparticle_p.h
@@ -71,6 +71,10 @@ protected:
void initialize(int gIdx, int pIdx) override;
void prepareNextFrame();
private:
+ bool clockShouldUpdate() const;
+ void updateClock();
+ void reconnectSystem(QQuickParticleSystem *system);
+ void reconnectParent(QQuickItem *parent);
void processDeletables();
void tick(int time = 0);
QSet<QQuickItem* > m_deletables;
@@ -85,6 +89,10 @@ private:
typedef QTickAnimationProxy<QQuickItemParticle, &QQuickItemParticle::tick> Clock;
Clock *clock;
+ QMetaObject::Connection m_systemRunStateConnection;
+ QMetaObject::Connection m_systemPauseStateConnection;
+ QMetaObject::Connection m_systemEnabledStateConnection;
+ QMetaObject::Connection m_parentEnabledStateConnection;
};
class QQuickItemParticleAttached : public QObject