(svn r21098) -Codechange: Ships now store their max speed in the cache instead of recalculating it every time.

This commit is contained in:
terkhen 2010-11-06 13:03:17 +00:00
parent c8a56f17f8
commit 25d1b2f54b
7 changed files with 42 additions and 18 deletions

View File

@ -1228,9 +1228,11 @@ static void LoadUnloadVehicle(Vehicle *v, int *cargo_left)
/* update stats */ /* update stats */
int t; int t;
switch (u->type) { switch (u->type) {
case VEH_TRAIN: t = u->vcache.cached_max_speed; break; case VEH_TRAIN: /* FALL THROUGH */
case VEH_SHIP:
t = u->vcache.cached_max_speed;
break;
case VEH_ROAD: t = u->max_speed / 2; 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. case VEH_AIRCRAFT: t = Aircraft::From(u)->GetSpeedOldUnits(); break; // Convert to old units.
default: NOT_REACHED(); default: NOT_REACHED();
} }

View File

@ -717,7 +717,8 @@ static uint32 VehicleGetVariable(const ResolverObject *object, byte variable, by
case 0x19: { case 0x19: {
uint max_speed; uint max_speed;
switch (v->type) { switch (v->type) {
case VEH_TRAIN: case VEH_TRAIN: /* FALL THROUGH */
case VEH_SHIP:
max_speed = v->vcache.cached_max_speed; max_speed = v->vcache.cached_max_speed;
break; break;

View File

@ -313,20 +313,32 @@ void AfterLoadVehicles(bool part_of_load)
FOR_ALL_VEHICLES(v) { FOR_ALL_VEHICLES(v) {
assert(v->first != NULL); assert(v->first != NULL);
if (v->type == VEH_TRAIN) { switch (v->type) {
Train *t = Train::From(v); case VEH_TRAIN: {
if (t->IsFrontEngine() || t->IsFreeWagon()) { Train *t = Train::From(v);
t->tcache.last_speed = t->cur_speed; // update displayed train speed if (t->IsFrontEngine() || t->IsFreeWagon()) {
t->ConsistChanged(false); t->tcache.last_speed = t->cur_speed; // update displayed train speed
} t->ConsistChanged(false);
} else if (v->type == VEH_ROAD) {
RoadVehicle *rv = RoadVehicle::From(v);
if (rv->IsRoadVehFront()) {
RoadVehUpdateCache(rv);
if (_settings_game.vehicle.roadveh_acceleration_model != AM_ORIGINAL) {
rv->CargoChanged();
} }
break;
} }
case VEH_ROAD: {
RoadVehicle *rv = RoadVehicle::From(v);
if (rv->IsRoadVehFront()) {
RoadVehUpdateCache(rv);
if (_settings_game.vehicle.roadveh_acceleration_model != AM_ORIGINAL) {
rv->CargoChanged();
}
}
break;
}
case VEH_SHIP:
Ship::From(v)->UpdateCache();
break;
default: break;
} }
} }

View File

@ -35,7 +35,7 @@ struct Ship: public SpecializedVehicle<Ship, VEH_SHIP> {
bool IsPrimaryVehicle() const { return true; } bool IsPrimaryVehicle() const { return true; }
SpriteID GetImage(Direction direction) const; SpriteID GetImage(Direction direction) const;
int GetDisplaySpeed() const { return this->cur_speed / 2; } int GetDisplaySpeed() const { return this->cur_speed / 2; }
int GetDisplayMaxSpeed() const { return this->max_speed / 2; } int GetDisplayMaxSpeed() const { return this->vcache.cached_max_speed / 2; }
Money GetRunningCost() const; Money GetRunningCost() const;
bool IsInDepot() const { return this->state == TRACK_BIT_DEPOT; } bool IsInDepot() const { return this->state == TRACK_BIT_DEPOT; }
bool Tick(); bool Tick();
@ -43,6 +43,7 @@ struct Ship: public SpecializedVehicle<Ship, VEH_SHIP> {
Trackdir GetVehicleTrackdir() const; Trackdir GetVehicleTrackdir() const;
TileIndex GetOrderStationLocation(StationID station); TileIndex GetOrderStationLocation(StationID station);
bool FindClosestDepot(TileIndex *location, DestinationID *destination, bool *reverse); bool FindClosestDepot(TileIndex *location, DestinationID *destination, bool *reverse);
void UpdateCache();
}; };
#define FOR_ALL_SHIPS(var) FOR_ALL_VEHICLES_OF_TYPE(Ship, var) #define FOR_ALL_SHIPS(var) FOR_ALL_VEHICLES_OF_TYPE(Ship, var)

View File

@ -153,6 +153,11 @@ static void CheckIfShipNeedsService(Vehicle *v)
SetWindowWidgetDirty(WC_VEHICLE_VIEW, v->index, VVW_WIDGET_START_STOP_VEH); SetWindowWidgetDirty(WC_VEHICLE_VIEW, v->index, VVW_WIDGET_START_STOP_VEH);
} }
void Ship::UpdateCache()
{
this->vcache.cached_max_speed = GetVehicleProperty(this, PROP_SHIP_SPEED, this->max_speed);
}
Money Ship::GetRunningCost() const Money Ship::GetRunningCost() const
{ {
const Engine *e = Engine::Get(this->engine_type); const Engine *e = Engine::Get(this->engine_type);
@ -296,7 +301,7 @@ static bool ShipAccelerate(Vehicle *v)
uint spd; uint spd;
byte t; byte t;
spd = min(v->cur_speed + 1, GetVehicleProperty(v, PROP_SHIP_SPEED, v->max_speed)); spd = min(v->cur_speed + 1, v->vcache.cached_max_speed);
/* updates statusbar only if speed have changed to save CPU time */ /* updates statusbar only if speed have changed to save CPU time */
if (spd != v->cur_speed) { if (spd != v->cur_speed) {
@ -615,6 +620,8 @@ CommandCost CmdBuildShip(TileIndex tile, DoCommandFlag flags, const Engine *e, u
v->cur_image = SPR_IMG_QUERY; v->cur_image = SPR_IMG_QUERY;
v->random_bits = VehicleRandomBits(); v->random_bits = VehicleRandomBits();
v->UpdateCache();
if (e->flags & ENGINE_EXCLUSIVE_PREVIEW) SetBit(v->vehicle_flags, VF_BUILT_AS_PROTOTYPE); if (e->flags & ENGINE_EXCLUSIVE_PREVIEW) SetBit(v->vehicle_flags, VF_BUILT_AS_PROTOTYPE);
v->InvalidateNewGRFCacheOfChain(); v->InvalidateNewGRFCacheOfChain();

View File

@ -1163,6 +1163,7 @@ void VehicleEnterDepot(Vehicle *v)
SetWindowClassesDirty(WC_SHIPS_LIST); SetWindowClassesDirty(WC_SHIPS_LIST);
Ship *ship = Ship::From(v); Ship *ship = Ship::From(v);
ship->state = TRACK_BIT_DEPOT; ship->state = TRACK_BIT_DEPOT;
ship->UpdateCache();
ship->UpdateViewport(true, true); ship->UpdateViewport(true, true);
SetWindowDirty(WC_VEHICLE_DEPOT, v->tile); SetWindowDirty(WC_VEHICLE_DEPOT, v->tile);
break; break;

View File

@ -807,7 +807,7 @@ static int CDECL VehicleReliabilitySorter(const Vehicle * const *a, const Vehicl
static int CDECL VehicleMaxSpeedSorter(const Vehicle * const *a, const Vehicle * const *b) static int CDECL VehicleMaxSpeedSorter(const Vehicle * const *a, const Vehicle * const *b)
{ {
int r = 0; int r = 0;
if (((*a)->type == VEH_TRAIN && (*b)->type == VEH_TRAIN) || ((*a)->type == VEH_AIRCRAFT && (*b)->type == VEH_AIRCRAFT)) { if ((*a)->type != VEH_ROAD && (*b)->type != VEH_ROAD) {
r = (*a)->vcache.cached_max_speed - (*b)->vcache.cached_max_speed; r = (*a)->vcache.cached_max_speed - (*b)->vcache.cached_max_speed;
} else { } else {
r = (*a)->max_speed - (*b)->max_speed; r = (*a)->max_speed - (*b)->max_speed;