1
0
Fork 0

AI traffic performance boost for busy airports

Stop ground elevation (scenery) checks for stationary AI aircraft.
This commit is contained in:
ThorstenB 2011-01-10 20:53:46 +01:00
parent c2a3d24ef3
commit 4043e79774
2 changed files with 19 additions and 2 deletions

View file

@ -84,6 +84,7 @@ FGAIAircraft::FGAIAircraft(FGAISchedule *ref) : FGAIBase(otAircraft) {
holdPos = false; holdPos = false;
needsTaxiClearance = false; needsTaxiClearance = false;
_needsGroundElevation = true;
_performance = 0; //TODO initialize to JET_TRANSPORT from PerformanceDB _performance = 0; //TODO initialize to JET_TRANSPORT from PerformanceDB
dt = 0; dt = 0;
@ -179,6 +180,8 @@ void FGAIAircraft::checkVisibility()
void FGAIAircraft::AccelTo(double speed) { void FGAIAircraft::AccelTo(double speed) {
tgt_speed = speed; tgt_speed = speed;
if (!isStationary())
_needsGroundElevation = true;
} }
@ -334,7 +337,7 @@ void FGAIAircraft::ProcessFlightPlan( double dt, time_t now ) {
use_perf_vs = true; use_perf_vs = true;
} }
} }
tgt_speed = prev->speed; AccelTo(prev->speed);
hdg_lock = alt_lock = true; hdg_lock = alt_lock = true;
no_roll = prev->on_ground; no_roll = prev->on_ground;
} }
@ -403,6 +406,8 @@ bool FGAIAircraft::loadNextLeg(double distance) {
void FGAIAircraft::getGroundElev(double dt) { void FGAIAircraft::getGroundElev(double dt) {
dt_elev_count += dt; dt_elev_count += dt;
if (!needGroundElevation())
return;
// Update minimally every three secs, but add some randomness // Update minimally every three secs, but add some randomness
// to prevent all AI objects doing this in synchrony // to prevent all AI objects doing this in synchrony
if (dt_elev_count < (3.0) + (rand() % 10)) if (dt_elev_count < (3.0) + (rand() % 10))
@ -424,14 +429,22 @@ void FGAIAircraft::getGroundElev(double dt) {
{ {
double alt; double alt;
if (getGroundElevationM(SGGeod::fromGeodM(pos, 20000), alt, 0)) if (getGroundElevationM(SGGeod::fromGeodM(pos, 20000), alt, 0))
{
tgt_altitude_ft = alt * SG_METER_TO_FEET; tgt_altitude_ft = alt * SG_METER_TO_FEET;
if (isStationary())
{
// aircraft is stationary and we obtained altitude for this spot - we're done.
_needsGroundElevation = false;
}
}
} }
} }
} }
void FGAIAircraft::doGroundAltitude() { void FGAIAircraft::doGroundAltitude() {
if (fabs(altitude_ft - (tgt_altitude_ft+groundOffset)) > 1000.0) if ((fabs(altitude_ft - (tgt_altitude_ft+groundOffset)) > 1000.0)||
(fabs(speed)<0.0001))
altitude_ft = (tgt_altitude_ft + groundOffset); altitude_ft = (tgt_altitude_ft + groundOffset);
else else
altitude_ft += 0.1 * ((tgt_altitude_ft+groundOffset) - altitude_ft); altitude_ft += 0.1 * ((tgt_altitude_ft+groundOffset) - altitude_ft);
@ -601,6 +614,7 @@ void FGAIAircraft::handleFirstWaypoint() {
Transform(); // make sure aip is initialized. Transform(); // make sure aip is initialized.
getGroundElev(60.1); // make sure it's executed first time around, so force a large dt value getGroundElev(60.1); // make sure it's executed first time around, so force a large dt value
doGroundAltitude(); doGroundAltitude();
_needsGroundElevation = true; // check ground elevation again (maybe scenery wasn't available yet)
} }
// Make sure to announce the aircraft's position // Make sure to announce the aircraft's position
announcePositionToController(); announcePositionToController();

View file

@ -141,6 +141,8 @@ private:
void updateActualState(); void updateActualState();
void handleATCRequests(); void handleATCRequests();
void checkVisibility(); void checkVisibility();
inline bool isStationary() { return ((fabs(speed)<=0.0001)&&(fabs(tgt_speed)<=0.0001));}
inline bool needGroundElevation() { if (!isStationary()) _needsGroundElevation=true;return _needsGroundElevation;}
double sign(double x); double sign(double x);
@ -160,6 +162,7 @@ private:
bool reachedWaypoint; bool reachedWaypoint;
bool needsTaxiClearance; bool needsTaxiClearance;
bool _needsGroundElevation;
time_t timeElapsed; time_t timeElapsed;
PerformanceData* _performance; // the performance data for this aircraft PerformanceData* _performance; // the performance data for this aircraft