Use pointer tags instead of dereferencing in RebuildVehicleTickCaches

This commit is contained in:
Jonathan G Rennison
2024-02-25 23:45:50 +00:00
parent bd04aff725
commit 0d20a54dc5

View File

@@ -1468,36 +1468,45 @@ void RemoveFromOtherVehicleTickCache(const Vehicle *v)
void RebuildVehicleTickCaches() void RebuildVehicleTickCaches()
{ {
Vehicle *si_v = nullptr;
SCOPE_INFO_FMT([&si_v], "RebuildVehicleTickCaches: %s", scope_dumper().VehicleInfo(si_v));
ClearVehicleTickCaches(); ClearVehicleTickCaches();
for (Vehicle *v : Vehicle::Iterate()) { for (VehicleID i = 0; i < Vehicle::GetPoolSize(); i++) {
si_v = v; Vehicle *v = Vehicle::Get(i);
switch (v->type) { if (v == nullptr) continue;
#if OTTD_UPPER_TAGGED_PTR
/* Avoid needing to de-reference v */
uintptr_t ptr = _vehicle_pool.GetRaw(i);
const VehicleType vtype = VehiclePoolOps::GetVehicleType(ptr);
const bool is_front = !VehiclePoolOps::IsNonFrontVehiclePtr(ptr);
#else
const VehicleType vtype = v->type;
const bool is_front = (v->Previous() == nullptr);
#endif
switch (vtype) {
default: default:
_tick_other_veh_cache.push_back(v); _tick_other_veh_cache.push_back(v);
break; break;
case VEH_TRAIN: case VEH_TRAIN:
if (v->Previous() == nullptr) _tick_train_front_cache.push_back(Train::From(v)); if (is_front) _tick_train_front_cache.push_back(Train::From(v));
break; break;
case VEH_ROAD: case VEH_ROAD:
if (v->Previous() == nullptr) _tick_road_veh_front_cache.push_back(RoadVehicle::From(v)); if (is_front) _tick_road_veh_front_cache.push_back(RoadVehicle::From(v));
break; break;
case VEH_AIRCRAFT: case VEH_AIRCRAFT:
if (v->Previous() == nullptr) _tick_aircraft_front_cache.push_back(Aircraft::From(v)); if (is_front) _tick_aircraft_front_cache.push_back(Aircraft::From(v));
break; break;
case VEH_SHIP: case VEH_SHIP:
if (v->Previous() == nullptr) _tick_ship_cache.push_back(Ship::From(v)); if (is_front) _tick_ship_cache.push_back(Ship::From(v));
break; break;
case VEH_EFFECT: case VEH_EFFECT:
_tick_effect_veh_cache.insert(v->index); _tick_effect_veh_cache.insert(i);
break; break;
} }
} }