Codechange: Cache train curve speed limit can be stored in 16 bits.

Cache curve speed modifier and max curve speed are both 16 bit values so can be stored in 16 bit types instead of 32 bit types.

(cherry picked from commit 3fc7b3b9a0)
pull/678/head
Peter Nelson 2 months ago committed by Jonathan G Rennison
parent a1b7ca979b
commit 64bc95722b

@ -1268,7 +1268,6 @@ struct vehicle_venc {
struct train_venc { struct train_venc {
VehicleID id; VehicleID id;
GroundVehicleCache gvcache; GroundVehicleCache gvcache;
int cached_curve_speed_mod;
uint8_t cached_tflags; uint8_t cached_tflags;
uint8_t cached_num_engines; uint8_t cached_num_engines;
uint16_t cached_centre_mass; uint16_t cached_centre_mass;
@ -1277,7 +1276,8 @@ struct train_venc {
uint16_t cached_uncapped_decel; uint16_t cached_uncapped_decel;
uint8_t cached_deceleration; uint8_t cached_deceleration;
byte user_def_data; byte user_def_data;
int cached_max_curve_speed; int16_t cached_curve_speed_mod;
uint16_t cached_max_curve_speed;
}; };
struct roadvehicle_venc { struct roadvehicle_venc {
@ -1340,7 +1340,6 @@ void Save_VENC()
for (Train *t : Train::Iterate()) { for (Train *t : Train::Iterate()) {
SlWriteUint32(t->index); SlWriteUint32(t->index);
write_gv_cache(t->gcache); write_gv_cache(t->gcache);
SlWriteUint32(t->tcache.cached_curve_speed_mod);
SlWriteByte(t->tcache.cached_tflags); SlWriteByte(t->tcache.cached_tflags);
SlWriteByte(t->tcache.cached_num_engines); SlWriteByte(t->tcache.cached_num_engines);
SlWriteUint16(t->tcache.cached_centre_mass); SlWriteUint16(t->tcache.cached_centre_mass);
@ -1349,7 +1348,8 @@ void Save_VENC()
SlWriteUint16(t->tcache.cached_uncapped_decel); SlWriteUint16(t->tcache.cached_uncapped_decel);
SlWriteByte(t->tcache.cached_deceleration); SlWriteByte(t->tcache.cached_deceleration);
SlWriteByte(t->tcache.user_def_data); SlWriteByte(t->tcache.user_def_data);
SlWriteUint32(t->tcache.cached_max_curve_speed); SlWriteUint16((uint16_t)t->tcache.cached_curve_speed_mod);
SlWriteUint16(t->tcache.cached_max_curve_speed);
} }
/* road vehicle */ /* road vehicle */
@ -1403,7 +1403,6 @@ void Load_VENC()
for (train_venc &venc : _train_vencs) { for (train_venc &venc : _train_vencs) {
venc.id = SlReadUint32(); venc.id = SlReadUint32();
read_gv_cache(venc.gvcache); read_gv_cache(venc.gvcache);
venc.cached_curve_speed_mod = SlReadUint32();
venc.cached_tflags = SlReadByte(); venc.cached_tflags = SlReadByte();
venc.cached_num_engines = SlReadByte(); venc.cached_num_engines = SlReadByte();
venc.cached_centre_mass = SlReadUint16(); venc.cached_centre_mass = SlReadUint16();
@ -1412,7 +1411,8 @@ void Load_VENC()
venc.cached_uncapped_decel = SlReadUint16(); venc.cached_uncapped_decel = SlReadUint16();
venc.cached_deceleration = SlReadByte(); venc.cached_deceleration = SlReadByte();
venc.user_def_data = SlReadByte(); venc.user_def_data = SlReadByte();
venc.cached_max_curve_speed = SlReadUint32(); venc.cached_curve_speed_mod = (int16_t)SlReadUint16();
venc.cached_max_curve_speed = SlReadUint16();
} }
_roadvehicle_vencs.resize(SlReadUint32()); _roadvehicle_vencs.resize(SlReadUint32());

@ -110,11 +110,7 @@ struct TrainCache {
/* Cached wagon override spritegroup */ /* Cached wagon override spritegroup */
const struct SpriteGroup *cached_override; const struct SpriteGroup *cached_override;
/* cached max. speed / acceleration data */
int cached_max_curve_speed; ///< max consist speed limited by curves
/* cached values, recalculated on load and each time a vehicle is added to/removed from the consist. */ /* cached values, recalculated on load and each time a vehicle is added to/removed from the consist. */
int cached_curve_speed_mod; ///< curve speed modifier of the entire train
TrainCacheFlags cached_tflags; ///< train cached flags TrainCacheFlags cached_tflags; ///< train cached flags
uint8_t cached_num_engines; ///< total number of engines, including rear ends of multiheaded engines uint8_t cached_num_engines; ///< total number of engines, including rear ends of multiheaded engines
uint16_t cached_centre_mass; ///< Cached position of the centre of mass, from the front uint16_t cached_centre_mass; ///< Cached position of the centre of mass, from the front
@ -124,6 +120,9 @@ struct TrainCache {
uint8_t cached_deceleration; ///< Cached deceleration for realistic braking lookahead purposes uint8_t cached_deceleration; ///< Cached deceleration for realistic braking lookahead purposes
byte user_def_data; ///< Cached property 0x25. Can be set by Callback 0x36. byte user_def_data; ///< Cached property 0x25. Can be set by Callback 0x36.
int16_t cached_curve_speed_mod; ///< curve speed modifier of the entire train
uint16_t cached_max_curve_speed; ///< max consist speed limited by curves
}; };
/** /**
@ -184,7 +183,7 @@ struct Train final : public GroundVehicle<Train, VEH_TRAIN> {
void ReserveTrackUnderConsist() const; void ReserveTrackUnderConsist() const;
int GetCurveSpeedLimit() const; uint16_t GetCurveSpeedLimit() const;
void ConsistChanged(ConsistChangeFlags allowed_changes); void ConsistChanged(ConsistChangeFlags allowed_changes);
@ -479,7 +478,7 @@ protected: // These functions should not be called outside acceleration code.
* Returns the curve speed modifier of this vehicle. * Returns the curve speed modifier of this vehicle.
* @return Current curve speed modifier, in fixed-point binary representation with 8 fractional bits. * @return Current curve speed modifier, in fixed-point binary representation with 8 fractional bits.
*/ */
inline int GetCurveSpeedModifier() const inline int16_t GetCurveSpeedModifier() const
{ {
return GetVehicleProperty(this, PROP_TRAIN_CURVE_SPEED_MOD, RailVehInfo(this->engine_type)->curve_speed_mod, true); return GetVehicleProperty(this, PROP_TRAIN_CURVE_SPEED_MOD, RailVehInfo(this->engine_type)->curve_speed_mod, true);
} }

@ -262,7 +262,7 @@ void Train::ConsistChanged(ConsistChangeFlags allowed_changes)
bool train_can_tilt = true; bool train_can_tilt = true;
bool speed_varies_by_railtype = false; bool speed_varies_by_railtype = false;
int min_curve_speed_mod = INT_MAX; int16_t min_curve_speed_mod = INT16_MAX;
for (Train *u = this; u != nullptr; u = u->Next()) { for (Train *u = this; u != nullptr; u = u->Next()) {
const RailVehicleInfo *rvi_u = RailVehInfo(u->engine_type); const RailVehicleInfo *rvi_u = RailVehInfo(u->engine_type);
@ -607,7 +607,7 @@ int GetTrainStopLocation(StationID station_id, TileIndex tile, Train *v, bool up
* Computes train speed limit caused by curves * Computes train speed limit caused by curves
* @return imposed speed limit * @return imposed speed limit
*/ */
int Train::GetCurveSpeedLimit() const uint16_t Train::GetCurveSpeedLimit() const
{ {
dbg_assert(this->First() == this); dbg_assert(this->First() == this);
@ -674,7 +674,7 @@ int Train::GetCurveSpeedLimit() const
max_speed = Clamp(max_speed, 2, absolute_max_speed); max_speed = Clamp(max_speed, 2, absolute_max_speed);
} }
return max_speed; return static_cast<uint16_t>(max_speed);
} }
void AdvanceOrderIndex(const Vehicle *v, VehicleOrderID &index) void AdvanceOrderIndex(const Vehicle *v, VehicleOrderID &index)

Loading…
Cancel
Save