(svn r21097) -Codechange: Unify cached max speed for all vehicle types.

This commit is contained in:
terkhen 2010-11-06 12:53:31 +00:00
parent 78d0a1cb1a
commit c8a56f17f8
9 changed files with 29 additions and 36 deletions

View File

@ -58,17 +58,10 @@ void AircraftNextAirportPos_and_Order(Aircraft *v);
void SetAircraftPosition(Aircraft *v, int x, int y, int z);
byte GetAircraftFlyingAltitude(const Aircraft *v);
/** Cached oftenly queried (NewGRF) values */
struct AircraftCache {
uint16 cached_max_speed; ///< Cached maximum speed of the aircraft.
};
/**
* Aircraft, helicopters, rotors and their shadows belong to this class.
*/
struct Aircraft : public SpecializedVehicle<Aircraft, VEH_AIRCRAFT> {
AircraftCache acache; ///< Cache of often used calculated values
uint16 crashed_counter; ///< Timer for handling crash animations.
byte pos; ///< Next desired position of the aircraft.
byte previous_pos; ///< Previous desired position of the aircraft.
@ -90,8 +83,8 @@ struct Aircraft : public SpecializedVehicle<Aircraft, VEH_AIRCRAFT> {
bool IsPrimaryVehicle() const { return this->IsNormalAircraft(); }
SpriteID GetImage(Direction direction) const;
int GetDisplaySpeed() const { return this->cur_speed; }
int GetDisplayMaxSpeed() const { return this->acache.cached_max_speed; }
int GetSpeedOldUnits() const { return this->acache.cached_max_speed * 10 / 128; }
int GetDisplayMaxSpeed() const { return this->vcache.cached_max_speed; }
int GetSpeedOldUnits() const { return this->vcache.cached_max_speed * 10 / 128; }
Money GetRunningCost() const;
bool IsInDepot() const { return (this->vehstatus & VS_HIDDEN) != 0 && IsHangarTile(this->tile); }
bool Tick();

View File

@ -535,10 +535,10 @@ void UpdateAircraftCache(Aircraft *v)
/* Convert from original units to km-ish/h */
max_speed = (max_speed * 128) / 10;
v->acache.cached_max_speed = max_speed;
v->vcache.cached_max_speed = max_speed;
} else {
/* Use the default max speed of the vehicle. */
v->acache.cached_max_speed = v->max_speed;
v->vcache.cached_max_speed = v->max_speed;
}
}
@ -570,9 +570,9 @@ static int UpdateAircraftSpeed(Aircraft *v, uint speed_limit = SPEED_LIMIT_NONE,
* and take-off speeds being too low. */
speed_limit *= _settings_game.vehicle.plane_speed;
if (v->acache.cached_max_speed < speed_limit) {
if (v->vcache.cached_max_speed < speed_limit) {
if (v->cur_speed < speed_limit) hard_limit = false;
speed_limit = v->acache.cached_max_speed;
speed_limit = v->vcache.cached_max_speed;
}
v->subspeed = (t = v->subspeed) + (byte)spd;
@ -640,7 +640,7 @@ byte GetAircraftFlyingAltitude(const Aircraft *v)
}
/* Make faster planes fly higher so that they can overtake slower ones */
base_altitude += min(20 * (v->acache.cached_max_speed / 200), 90);
base_altitude += min(20 * (v->vcache.cached_max_speed / 200), 90);
return base_altitude;
}

View File

@ -1228,7 +1228,7 @@ static void LoadUnloadVehicle(Vehicle *v, int *cargo_left)
/* update stats */
int t;
switch (u->type) {
case VEH_TRAIN: t = Train::From(u)->tcache.cached_max_speed; break;
case VEH_TRAIN: t = u->vcache.cached_max_speed; break;
case VEH_ROAD: t = u->max_speed / 2; break;
case VEH_SHIP: t = u->max_speed; break;
case VEH_AIRCRAFT: t = Aircraft::From(u)->GetSpeedOldUnits(); break; // Convert to old units.

View File

@ -718,7 +718,7 @@ static uint32 VehicleGetVariable(const ResolverObject *object, byte variable, by
uint max_speed;
switch (v->type) {
case VEH_TRAIN:
max_speed = Train::From(v)->tcache.cached_max_speed;
max_speed = v->vcache.cached_max_speed;
break;
case VEH_AIRCRAFT:

View File

@ -1134,14 +1134,15 @@ static void CheckCaches()
for (const Vehicle *u = v; u != NULL; u = u->Next()) length++;
NewGRFCache *grf_cache = CallocT<NewGRFCache>(length);
VehicleCache *veh_cache = CallocT<VehicleCache>(length);
AccelerationCache *acc_cache = CallocT<AccelerationCache>(length);
TrainCache *tra_cache = CallocT<TrainCache>(length);
RoadVehicleCache *roa_cache = CallocT<RoadVehicleCache>(length);
AircraftCache *air_cache = CallocT<AircraftCache>(length);
length = 0;
for (const Vehicle *u = v; u != NULL; u = u->Next()) {
grf_cache[length] = u->grf_cache;
veh_cache[length] = u->vcache;
switch (u->type) {
case VEH_TRAIN:
acc_cache[length] = Train::From(u)->acc_cache;
@ -1151,8 +1152,6 @@ static void CheckCaches()
acc_cache[length] = RoadVehicle::From(u)->acc_cache;
roa_cache[length] = RoadVehicle::From(u)->rcache;
break;
case VEH_AIRCRAFT:
air_cache[length] = Aircraft::From(u)->acache;
default:
break;
}
@ -1171,6 +1170,9 @@ static void CheckCaches()
if (memcmp(&grf_cache[length], &u->grf_cache, sizeof(NewGRFCache)) != 0) {
DEBUG(desync, 2, "newgrf cache mismatch: type %i, vehicle %i, company %i, unit number %i, wagon %i", (int)v->type, v->index, (int)v->owner, v->unitnumber, length);
}
if (memcmp(&veh_cache[length], &u->vcache, sizeof(VehicleCache)) != 0) {
DEBUG(desync, 2, "vehicle cache mismatch: type %i, vehicle %i, company %i, unit number %i, wagon %i", (int)v->type, v->index, (int)v->owner, v->unitnumber, length);
}
switch (u->type) {
case VEH_TRAIN:
if (memcmp(&acc_cache[length], &Train::From(u)->acc_cache, sizeof(AccelerationCache)) != 0) {
@ -1188,11 +1190,6 @@ static void CheckCaches()
DEBUG(desync, 2, "road vehicle cache mismatch: vehicle %i, company %i, unit number %i, wagon %i", v->index, (int)v->owner, v->unitnumber, length);
}
break;
case VEH_AIRCRAFT:
if (memcmp(&air_cache[length], &Aircraft::From(u)->acache, sizeof(AircraftCache)) != 0) {
DEBUG(desync, 2, "aircraft cache mismatch: vehicle %i, company %i, unit number %i", v->index, (int)v->owner, v->unitnumber);
}
break;
default:
break;
}
@ -1200,10 +1197,10 @@ static void CheckCaches()
}
free(grf_cache);
free(veh_cache);
free(acc_cache);
free(tra_cache);
free(roa_cache);
free(air_cache);
}
/* Check whether the caches are still valid */

View File

@ -76,7 +76,6 @@ struct TrainCache {
bool cached_tilt; ///< train can tilt; feature provides a bonus in curves
/* cached max. speed / acceleration data */
uint16 cached_max_speed; ///< max speed of the consist. (minimum of the max speed of all vehicles in the consist)
int cached_max_curve_speed; ///< max consist speed limited by curves
/**
@ -127,7 +126,7 @@ struct Train : public GroundVehicle<Train, VEH_TRAIN> {
bool IsPrimaryVehicle() const { return this->IsFrontEngine(); }
SpriteID GetImage(Direction direction) const;
int GetDisplaySpeed() const { return this->tcache.last_speed; }
int GetDisplayMaxSpeed() const { return this->tcache.cached_max_speed; }
int GetDisplayMaxSpeed() const { return this->vcache.cached_max_speed; }
Money GetRunningCost() const;
int GetDisplayImageWidth(Point *offset = NULL) const;
bool IsInDepot() const;

View File

@ -285,7 +285,7 @@ void Train::ConsistChanged(bool same_length)
}
/* store consist weight/max speed in cache */
this->tcache.cached_max_speed = max_speed;
this->vcache.cached_max_speed = max_speed;
this->tcache.cached_tilt = train_can_tilt;
this->tcache.cached_max_curve_speed = this->GetCurveSpeedLimit();
@ -1984,7 +1984,7 @@ static void HandleLocomotiveSmokeCloud(const Train *v)
* third of its maximum speed spectrum. Steam emission finally normalises at very close to train's maximum speed.
* REGULATION:
* - instead of 1, 4 / 2^smoke_amount (max. 2) is used to provide sufficient regulation to steam puffs' amount. */
if (GB(v->tick_counter, 0, ((4 >> _settings_game.vehicle.smoke_amount) + ((u->cur_speed * 3) / u->tcache.cached_max_speed))) == 0) {
if (GB(v->tick_counter, 0, ((4 >> _settings_game.vehicle.smoke_amount) + ((u->cur_speed * 3) / u->vcache.cached_max_speed))) == 0) {
CreateEffectVehicleRel(v, x, y, 10, EV_STEAM_SMOKE);
sound = true;
}
@ -2002,8 +2002,8 @@ static void HandleLocomotiveSmokeCloud(const Train *v)
* REGULATION:
* - up to which speed a diesel train is emitting smoke (with reduced/small setting only until 1/2 of max_speed),
* - in Chance16 - the last value is 512 / 2^smoke_amount (max. smoke when 128 = smoke_amount of 2). */
if (u->cur_speed < (u->tcache.cached_max_speed >> (2 >> _settings_game.vehicle.smoke_amount)) &&
Chance16((64 - ((u->cur_speed << 5) / u->tcache.cached_max_speed) + (32 >> (u->acc_cache.cached_power >> 10)) - (32 >> (u->acc_cache.cached_weight >> 9))), (512 >> _settings_game.vehicle.smoke_amount))) {
if (u->cur_speed < (u->vcache.cached_max_speed >> (2 >> _settings_game.vehicle.smoke_amount)) &&
Chance16((64 - ((u->cur_speed << 5) / u->vcache.cached_max_speed) + (32 >> (u->acc_cache.cached_power >> 10)) - (32 >> (u->acc_cache.cached_weight >> 9))), (512 >> _settings_game.vehicle.smoke_amount))) {
CreateEffectVehicleRel(v, 0, 0, 10, EV_DIESEL_SMOKE);
sound = true;
}
@ -2017,7 +2017,7 @@ static void HandleLocomotiveSmokeCloud(const Train *v)
* REGULATION:
* - in Chance16 the last value is 360 / 2^smoke_amount (max. sparks when 90 = smoke_amount of 2). */
if (GB(v->tick_counter, 0, 2) == 0 &&
Chance16((6 - ((u->cur_speed << 2) / u->tcache.cached_max_speed)), (360 >> _settings_game.vehicle.smoke_amount))) {
Chance16((6 - ((u->cur_speed << 2) / u->vcache.cached_max_speed)), (360 >> _settings_game.vehicle.smoke_amount))) {
CreateEffectVehicleRel(v, 0, 0, 10, EV_ELECTRIC_SPARK);
sound = true;
}

View File

@ -64,6 +64,11 @@ struct NewGRFCache {
uint8 cache_valid; ///< Bitset that indicates which cache values are valid.
};
/** Cached often queried values common to all vehicles. */
struct VehicleCache {
uint16 cached_max_speed; ///< Maximum speed of the consist (minimum of the max speed of all vehicles in the consist).
};
/** A vehicle pool for a little over 1 million vehicles. */
typedef Pool<Vehicle, VehicleID, 512, 0xFF000> VehiclePool;
extern VehiclePool _vehicle_pool;
@ -199,6 +204,7 @@ public:
byte subtype; ///< subtype (Filled with values from #EffectVehicles/#TrainSubTypes/#AircraftSubTypes)
NewGRFCache grf_cache; ///< Cache of often used calculated NewGRF values
VehicleCache vcache; ///< Cache of often used vehicle values.
/** Create a new vehicle */
Vehicle(VehicleType type = VEH_INVALID);

View File

@ -807,10 +807,8 @@ static int CDECL VehicleReliabilitySorter(const Vehicle * const *a, const Vehicl
static int CDECL VehicleMaxSpeedSorter(const Vehicle * const *a, const Vehicle * const *b)
{
int r = 0;
if ((*a)->type == VEH_TRAIN && (*b)->type == VEH_TRAIN) {
r = Train::From(*a)->tcache.cached_max_speed - Train::From(*b)->tcache.cached_max_speed;
} if ((*a)->type == VEH_AIRCRAFT && (*b)->type == VEH_AIRCRAFT) {
r = Aircraft::From(*a)->acache.cached_max_speed - Aircraft::From(*b)->acache.cached_max_speed;
if (((*a)->type == VEH_TRAIN && (*b)->type == VEH_TRAIN) || ((*a)->type == VEH_AIRCRAFT && (*b)->type == VEH_AIRCRAFT)) {
r = (*a)->vcache.cached_max_speed - (*b)->vcache.cached_max_speed;
} else {
r = (*a)->max_speed - (*b)->max_speed;
}