From 6aedee898e51804863f4e94f5bdcaece9398fe0a Mon Sep 17 00:00:00 2001 From: Tim Blechmann Date: Mon, 31 Aug 2015 10:16:29 +0200 Subject: AnimatedSprite: avoid unnecessary redraws MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit AnimatedSprite currently triggers a redraw for every update. however this should only be done, when the next frame will actually be different to the current one. Change-Id: I550bd32c02807e4c3f4847fb2608f5ad0cf0a59a Reviewed-by: Jan Arve Sæther --- src/quick/items/qquickanimatedsprite.cpp | 20 ++++++++++++++++---- src/quick/items/qquickanimatedsprite_p.h | 1 + 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/quick/items/qquickanimatedsprite.cpp b/src/quick/items/qquickanimatedsprite.cpp index 5e653e426c..e37ed6c18c 100644 --- a/src/quick/items/qquickanimatedsprite.cpp +++ b/src/quick/items/qquickanimatedsprite.cpp @@ -374,6 +374,7 @@ void QQuickAnimatedSprite::stop() return; m_pauseOffset = 0; emit runningChanged(false); + update(); } /*! @@ -391,6 +392,7 @@ void QQuickAnimatedSprite::advance(int frames) m_curFrame += m_spriteEngine->maxFrames(); m_curFrame = m_curFrame % m_spriteEngine->maxFrames(); emit currentFrameChanged(m_curFrame); + update(); } /*! @@ -408,6 +410,7 @@ void QQuickAnimatedSprite::pause() m_pauseOffset = m_timestamp.elapsed(); m_paused = true; emit pausedChanged(true); + update(); } /*! @@ -425,6 +428,7 @@ void QQuickAnimatedSprite::resume() m_pauseOffset = m_pauseOffset - m_timestamp.elapsed(); m_paused = false; emit pausedChanged(false); + update(); } void QQuickAnimatedSprite::createEngine() @@ -436,6 +440,7 @@ void QQuickAnimatedSprite::createEngine() m_spriteEngine = new QQuickSpriteEngine(QList(spriteList), this); m_spriteEngine->startAssemblingImage(); reset(); + update(); } static QSGGeometry::Attribute AnimatedSprite_Attributes[] = { @@ -555,9 +560,12 @@ QSGNode *QQuickAnimatedSprite::updatePaintNode(QSGNode *, UpdatePaintNodeData *) prepareNextFrame(); if (m_running) { - update(); - if (m_node) + if (!m_paused) + update(); + + if (m_node) { m_node->markDirty(QSGNode::DirtyMaterial); + } } return m_node; @@ -614,12 +622,16 @@ void QQuickAnimatedSprite::prepareNextFrame() frameAt = 0; m_running = false; emit runningChanged(false); + update(); } } else { frameAt = m_curFrame; } - if (m_curFrame != lastFrame && isCurrentFrameChangedConnected()) - emit currentFrameChanged(m_curFrame); + if (m_curFrame != lastFrame) { + if (isCurrentFrameChangedConnected()) + emit currentFrameChanged(m_curFrame); + update(); + } qreal frameCount = m_spriteEngine->spriteFrames(); bool reverse = m_spriteEngine->sprite()->reverse(); diff --git a/src/quick/items/qquickanimatedsprite_p.h b/src/quick/items/qquickanimatedsprite_p.h index 4778afc88b..e535f1b077 100644 --- a/src/quick/items/qquickanimatedsprite_p.h +++ b/src/quick/items/qquickanimatedsprite_p.h @@ -333,6 +333,7 @@ public Q_SLOTS: if (m_curFrame != arg) { m_curFrame = arg; Q_EMIT currentFrameChanged(arg); //TODO-C Only emitted on manual advance! + update(); } } -- cgit v1.2.3