From 8efdddde39a70cd76c2aef5b6cecb9237d202054 Mon Sep 17 00:00:00 2001 From: Emil Axelsson Date: Fri, 23 Sep 2016 00:27:06 +0200 Subject: [PATCH] avoid oversampling in time sync --- include/openspace/util/timemanager.h | 1 - src/util/timemanager.cpp | 22 ++++++++++++++-------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/include/openspace/util/timemanager.h b/include/openspace/util/timemanager.h index 9e3d7dcc4b..5f863d22b9 100644 --- a/include/openspace/util/timemanager.h +++ b/include/openspace/util/timemanager.h @@ -35,7 +35,6 @@ public: void preSynchronization(double dt); void addKeyframe(const network::datamessagestructures::TimeKeyframe& kf); void removeKeyframesBefore(double timestamp); - void removeKeyframesAfter(double timestamp); void clearKeyframes(); private: void consumeKeyframes(double dt); diff --git a/src/util/timemanager.cpp b/src/util/timemanager.cpp index ed619af340..bba05e72a8 100644 --- a/src/util/timemanager.cpp +++ b/src/util/timemanager.cpp @@ -26,6 +26,10 @@ #include #include +namespace { + double SecondsOffTolerance = 0.1; +} + namespace openspace { using network::datamessagestructures::TimeKeyframe; @@ -73,10 +77,10 @@ void TimeManager::consumeKeyframes(double dt) { time.setPause(latest._paused); time.setTimeJumped(consumingTimeJump); + time.setDeltaTime(latest._dt); if (consumingTimeJump || latest._paused) { time.setTime(latest._time, consumingTimeJump); - time.setDeltaTime(latest._dt); } _latestConsumedTimestamp = latest._timestamp; } @@ -92,6 +96,14 @@ void TimeManager::consumeKeyframes(double dt) { return; } + double predictedTime = time.j2000Seconds() + time.deltaTime() * (next._timestamp - now); + bool withinTolerance = std::abs(predictedTime - next._time) < std::abs(next._dt * SecondsOffTolerance); + + if (next._dt == time.deltaTime() && withinTolerance) { + Time::ref().advanceTime(dt); + return; + } + double t0 = now - dt; double t1 = now; double t2 = next._timestamp; @@ -123,17 +135,11 @@ void TimeManager::addKeyframe(const TimeKeyframe& kf) { _keyframes.insert(iter, kf); } -void TimeManager::removeKeyframesAfter(double timestamp) { - network::datamessagestructures::TimeKeyframe kf; - kf._timestamp = timestamp; - auto iter = std::upper_bound(_keyframes.begin(), _keyframes.end(), kf, &TimeManager::compareKeyframeTimes); - _keyframes.erase(iter, _keyframes.end()); -} void TimeManager::removeKeyframesBefore(double timestamp) { network::datamessagestructures::TimeKeyframe kf; kf._timestamp = timestamp; - auto iter = std::lower_bound(_keyframes.begin(), _keyframes.end(), kf, &TimeManager::compareKeyframeTimes); + auto iter = std::upper_bound(_keyframes.begin(), _keyframes.end(), kf, &TimeManager::compareKeyframeTimes); _keyframes.erase(_keyframes.begin(), iter); }