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>
bb10
Gunnar Sletta 2012-02-08 10:16:37 +01:00 committed by Qt by Nokia
parent 88f15faa4a
commit 0efb8a7ee3
3 changed files with 9 additions and 2 deletions

View File

@ -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;

View File

@ -149,7 +149,7 @@ public:
bool isRunning() const;
qint64 elapsed() const;
virtual qint64 elapsed() const;
Q_SIGNALS:
void started();

View File

@ -185,6 +185,7 @@ public:
bool canUninstallAnimationDriver(QAnimationDriver *driver);
void restart();
void maybeUpdateAnimationsToCurrentTime();
void updateAnimationTimers(qint64 currentTick);
//useful for profiling/debugging