summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGunnar Sletta <gunnar.sletta@nokia.com>2012-02-08 10:16:37 +0100
committerQt by Nokia <qt-info@nokia.com>2012-02-09 00:32:41 +0100
commit0efb8a7ee3ef3ca37760ecf1972c0f2bc5ae2846 (patch)
tree20fff7c5af300c558c864eaac26a98e1c47a1eff
parent88f15faa4aad798d37df6a4baf1950c31d04dcf1 (diff)
Avoid advancing animations outside the animation "tick"
We have logic to prevent animations from starting in the middle of an animation as a result of a previously slow frame. This was based on current time, not the animation driver time and would cause severe jumping when custom animation drivers were being used. Also, this logic would trigger multiple animation runs per frame, which is very bad for performance, so this change introduces a threshold of 50ms to compensate for that. 50ms because that is triplebuffer limit. Change-Id: I1c7ebac30060e849d03c14d62411c2b953854d98 Reviewed-by: Michael Brasser <michael.brasser@nokia.com>
-rw-r--r--src/corelib/animation/qabstractanimation.cpp8
-rw-r--r--src/corelib/animation/qabstractanimation.h2
-rw-r--r--src/corelib/animation/qabstractanimation_p.h1
3 files changed, 9 insertions, 2 deletions
diff --git a/src/corelib/animation/qabstractanimation.cpp b/src/corelib/animation/qabstractanimation.cpp
index 30f071498e..04df52c6f0 100644
--- a/src/corelib/animation/qabstractanimation.cpp
+++ b/src/corelib/animation/qabstractanimation.cpp
@@ -248,6 +248,12 @@ QUnifiedTimer *QUnifiedTimer::instance()
return instance(true);
}
+void QUnifiedTimer::maybeUpdateAnimationsToCurrentTime()
+{
+ if (time.elapsed() - lastTick > 50)
+ updateAnimationTimers(driver->elapsed());
+}
+
void QUnifiedTimer::updateAnimationTimers(qint64 currentTick)
{
//setCurrentTime can get this called again while we're the for loop. At least with pauseAnimations
@@ -590,7 +596,7 @@ void QAnimationTimer::startAnimations()
startAnimationPending = false;
//force timer to update, which prevents large deltas for our newly added animations
if (!animations.isEmpty())
- QUnifiedTimer::instance()->updateAnimationTimers(-1);
+ QUnifiedTimer::instance()->maybeUpdateAnimationsToCurrentTime();
//we transfer the waiting animations into the "really running" state
animations += animationsToStart;
diff --git a/src/corelib/animation/qabstractanimation.h b/src/corelib/animation/qabstractanimation.h
index 70200c4064..34ddbc606f 100644
--- a/src/corelib/animation/qabstractanimation.h
+++ b/src/corelib/animation/qabstractanimation.h
@@ -149,7 +149,7 @@ public:
bool isRunning() const;
- qint64 elapsed() const;
+ virtual qint64 elapsed() const;
Q_SIGNALS:
void started();
diff --git a/src/corelib/animation/qabstractanimation_p.h b/src/corelib/animation/qabstractanimation_p.h
index c4d53342c2..02a3c02ddc 100644
--- a/src/corelib/animation/qabstractanimation_p.h
+++ b/src/corelib/animation/qabstractanimation_p.h
@@ -185,6 +185,7 @@ public:
bool canUninstallAnimationDriver(QAnimationDriver *driver);
void restart();
+ void maybeUpdateAnimationsToCurrentTime();
void updateAnimationTimers(qint64 currentTick);
//useful for profiling/debugging