From 0efb8a7ee3ef3ca37760ecf1972c0f2bc5ae2846 Mon Sep 17 00:00:00 2001 From: Gunnar Sletta Date: Wed, 8 Feb 2012 10:16:37 +0100 Subject: 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 --- src/corelib/animation/qabstractanimation.cpp | 8 +++++++- src/corelib/animation/qabstractanimation.h | 2 +- src/corelib/animation/qabstractanimation_p.h | 1 + 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 -- cgit v1.2.3