From 439ad4a7c8278ed5208add0c42b478547952cdad Mon Sep 17 00:00:00 2001 From: ThorstenB Date: Sat, 24 Nov 2012 12:06:20 +0100 Subject: [PATCH] Traffic performance: cache track length Track length is calculate every iteration/for every aircraft. Since some tracks have hundreds of waypoints, calculation is slow. Cache the track length between the waypoints ahead, so it rarely needs to be recalculated. --- src/AIModel/AIAircraft.cxx | 13 ++++++++++++- src/AIModel/AIAircraft.hxx | 7 +++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/AIModel/AIAircraft.cxx b/src/AIModel/AIAircraft.cxx index d2aac7502..762240247 100644 --- a/src/AIModel/AIAircraft.cxx +++ b/src/AIModel/AIAircraft.cxx @@ -94,6 +94,8 @@ FGAIAircraft::FGAIAircraft(FGAISchedule *ref) : _performance = 0; //TODO initialize to JET_TRANSPORT from PerformanceDB dt = 0; takeOffStatus = 0; + + trackCache.remainingLength = 0; } @@ -1347,7 +1349,16 @@ time_t FGAIAircraft::checkForArrivalTime(const string& wptName) { FGAIWaypoint* curr = 0; curr = fp->getCurrentWaypoint(); - double tracklength = fp->checkTrackLength(wptName); + // don't recalculate tracklength unless the start/stop waypoint has changed + if (curr && + ((curr->getName() != trackCache.startWptName)|| + (wptName != trackCache.finalWptName))) + { + trackCache.remainingLength = fp->checkTrackLength(wptName); + trackCache.startWptName = curr->getName(); + trackCache.finalWptName = wptName; + } + double tracklength = trackCache.remainingLength; if (tracklength > 0.1) { tracklength += fp->getDistanceToGo(pos.getLatitudeDeg(), pos.getLongitudeDeg(), curr); } else { diff --git a/src/AIModel/AIAircraft.hxx b/src/AIModel/AIAircraft.hxx index 9d8fc8e5e..3ce0d6283 100644 --- a/src/AIModel/AIAircraft.hxx +++ b/src/AIModel/AIAircraft.hxx @@ -184,6 +184,13 @@ private: PerformanceData* _performance; // the performance data for this aircraft void assertSpeed(double speed); + + struct + { + double remainingLength; + std::string startWptName; + std::string finalWptName; + } trackCache; }; -- 2.39.5