1
0
Fork 0

preparation for the lag correction based on time sync, instead of fixed

lag compensation, this is the time manager part.
- introduction of a pure steady clock initialised from system clock at init
- the mp protocol clock have an offset available (will be used
to sync the players, in case ntpd is not accurate or inavailable)
- got a way to see drift between system clock and the fg steady clock, mainly
to see how differents OS behave ...
This commit is contained in:
jean pellotier 2018-12-18 01:41:26 +01:00
parent c3cd7b3978
commit faf06b42a3
2 changed files with 37 additions and 7 deletions

View file

@ -75,7 +75,7 @@ void TimeManager::init()
_firstUpdate = true;
_inited = true;
_dtRemainder = 0.0;
_mpProtocolClock = 0.0;
_mpProtocolClock = _steadyClock = 0.0;
_adjustWarpOnUnfreeze = false;
_maxDtPerFrame = fgGetNode("/sim/max-simtime-per-frame", true);
@ -114,13 +114,21 @@ void TimeManager::init()
_modelHz = fgGetNode("sim/model-hz", true);
_timeDelta = fgGetNode("sim/time/delta-realtime-sec", true);
_simTimeDelta = fgGetNode("sim/time/delta-sec", true);
_mpClockNode = fgGetNode("sim/time/mp-clock-sec", true);
_mpProtocolClockNode = fgGetNode("sim/time/mp-clock-sec", true);
_steadyClockNode = fgGetNode("sim/time/steady-clock-sec", true);
_mpClockOffset = fgGetNode("sim/time/mp-clock-offset-sec", true);
_steadyClockDrift = fgGetNode("sim/time/steady-clock-drift-ms", true);
_computeDrift = fgGetNode("sim/time/compute-clock-drift", true);
_frameWait = fgGetNode("sim/time/frame-wait-ms", true);
_simTimeFactor = fgGetNode("/sim/speed-up", true);
// use pre-set value but ensure we get a sane default
if (!_simTimeDelta->hasValue()) {
_simTimeFactor->setDoubleValue(1.0);
}
if (!_mpClockOffset->hasValue()) {
_mpClockOffset->setDoubleValue(0.0);
}
_computeDrift->setBoolValue(true);
}
void TimeManager::unbind()
@ -138,7 +146,11 @@ void TimeManager::unbind()
_modelHz.clear();
_timeDelta.clear();
_simTimeDelta.clear();
_mpClockNode.clear();
_mpProtocolClockNode.clear();
_steadyClockNode.clear();
_mpClockOffset.clear();
_steadyClockDrift.clear();
_computeDrift.clear();
_simTimeFactor.clear();
}
@ -189,7 +201,7 @@ void TimeManager::computeTimeDeltas(double& simDt, double& realDt)
// we initialise the mp protocol clock with the system clock.
_systemStamp.systemClockHoursAndMinutes();
_mpProtocolClock = _systemStamp.toSecs();
_steadyClock = _systemStamp.toSecs();
_firstUpdate = false;
_lastClockFreeze = _clockFreeze->getBoolValue();
@ -209,6 +221,16 @@ void TimeManager::computeTimeDeltas(double& simDt, double& realDt)
SGTimeStamp currentStamp;
currentStamp.stamp();
// if asked, we compute the drift between the steady clock and the system clock
if (_computeDrift->getBoolValue()) {
_systemStamp.systemClockHoursAndMinutes();
double clockdrift = _steadyClock + (currentStamp - _lastStamp).toSecs()
+ _dtRemainder - _systemStamp.toSecs();
_steadyClockDrift->setDoubleValue(clockdrift * 1000.0);
_computeDrift->setBoolValue(false);
}
// this dt will be clamped by the max sim time by frame.
double dt = (currentStamp - _lastStamp).toSecs();
@ -260,9 +282,11 @@ void TimeManager::computeTimeDeltas(double& simDt, double& realDt)
_lastStamp = currentStamp;
globals->inc_sim_time_sec(simDt);
_mpProtocolClock += mpProtocolDt;
_steadyClock += mpProtocolDt;
_mpProtocolClock = _steadyClock + _mpClockOffset->getDoubleValue();
_mpClockNode->setDoubleValue(_mpProtocolClock);
_steadyClockNode->setDoubleValue(_steadyClock);
_mpProtocolClockNode->setDoubleValue(_mpProtocolClock);
// These are useful, especially for Nasal scripts.
_timeDelta->setDoubleValue(realDt);

View file

@ -48,6 +48,7 @@ public:
void setTimeOffset(const std::string& offset_type, long int offset);
inline double getMPProtocolClockSec() const { return _mpProtocolClock; }
inline double getSteadyClockSec() const { return _steadyClock; }
static const char* subsystemName() { return "time"; }
private:
@ -80,7 +81,11 @@ private:
SGPropertyNode_ptr _warp;
SGPropertyNode_ptr _warpDelta;
SGPropertyNode_ptr _simTimeFactor;
SGPropertyNode_ptr _mpClockNode;
SGPropertyNode_ptr _mpProtocolClockNode;
SGPropertyNode_ptr _steadyClockNode;
SGPropertyNode_ptr _mpClockOffset;
SGPropertyNode_ptr _steadyClockDrift;
SGPropertyNode_ptr _computeDrift;
SGPropertyNode_ptr _frameWait;
SGPropertyNode_ptr _maxFrameRate;
@ -94,6 +99,7 @@ private:
time_t _lastFrameTime;
double _frameLatencyMax;
double _mpProtocolClock;
double _steadyClock;
int _frameCount;
SGPropertyNode_ptr _sceneryLoaded;