Calibrate every 5 seconds instead of every 1000 calls. When many things are being animated, the timer will get a ton of calls and the variation in the number of millis elapsed per timer time may be leading to unwanted variations in the drift value.
git-svn-id: svn+ssh://src.earth.threerings.net/nenya/trunk@432 ed5b42cb-e716-0410-a449-f6a68f950b19
This commit is contained in:
@@ -19,6 +19,7 @@ public abstract class CalibratingTimer
|
|||||||
protected void init (long milliDivider, long microDivider)
|
protected void init (long milliDivider, long microDivider)
|
||||||
{
|
{
|
||||||
_milliDivider = milliDivider;
|
_milliDivider = milliDivider;
|
||||||
|
_calibrationInterval = 5 * 1000 * _milliDivider;// Calibrate every 5 seconds
|
||||||
_microDivider = microDivider;
|
_microDivider = microDivider;
|
||||||
reset();
|
reset();
|
||||||
Log.info("Using " + getClass() + " timer [mfreq=" + _milliDivider + ", ufreq="
|
Log.info("Using " + getClass() + " timer [mfreq=" + _milliDivider + ", ufreq="
|
||||||
@@ -43,16 +44,15 @@ public abstract class CalibratingTimer
|
|||||||
_startStamp = _priorCurrent = current();
|
_startStamp = _priorCurrent = current();
|
||||||
_driftMilliStamp = System.currentTimeMillis();
|
_driftMilliStamp = System.currentTimeMillis();
|
||||||
_driftTimerStamp = current();
|
_driftTimerStamp = current();
|
||||||
_callsSinceCalibration = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Returns the difference between _startStamp and current() */
|
/** Returns the difference between _startStamp and current() */
|
||||||
protected long elapsed ()
|
protected long elapsed ()
|
||||||
{
|
{
|
||||||
if (_callsSinceCalibration++ > 1000) {
|
long current = current();
|
||||||
|
if ((current - _driftTimerStamp) > _calibrationInterval) {
|
||||||
calibrate();
|
calibrate();
|
||||||
}
|
}
|
||||||
long current = current();
|
|
||||||
if (_driftRatio != 1.0) {
|
if (_driftRatio != 1.0) {
|
||||||
long elapsed = current - _priorCurrent;
|
long elapsed = current - _priorCurrent;
|
||||||
_startStamp += (elapsed - (elapsed * _driftRatio));
|
_startStamp += (elapsed - (elapsed * _driftRatio));
|
||||||
@@ -77,7 +77,6 @@ public abstract class CalibratingTimer
|
|||||||
}
|
}
|
||||||
_driftMilliStamp = System.currentTimeMillis();
|
_driftMilliStamp = System.currentTimeMillis();
|
||||||
_driftTimerStamp = current();
|
_driftTimerStamp = current();
|
||||||
_callsSinceCalibration = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Return the current value for this timer. */
|
/** Return the current value for this timer. */
|
||||||
@@ -104,7 +103,7 @@ public abstract class CalibratingTimer
|
|||||||
/** Ratio of currentTimeMillis to timer millis. */
|
/** Ratio of currentTimeMillis to timer millis. */
|
||||||
protected double _driftRatio = 1.0;
|
protected double _driftRatio = 1.0;
|
||||||
|
|
||||||
/** Number of calls to elapsed since we've called calibrate. */
|
/** Amount of timer ticks that elapse between calibrations. */
|
||||||
protected int _callsSinceCalibration = 0;
|
protected long _calibrationInterval;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user