From 0d20a54dc543a92b4a2f7126aa4657476303fb77 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Sun, 25 Feb 2024 23:45:50 +0000 Subject: [PATCH] Use pointer tags instead of dereferencing in RebuildVehicleTickCaches --- src/vehicle.cpp | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/src/vehicle.cpp b/src/vehicle.cpp index 9977b6248f..e9c44cdad1 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -1468,36 +1468,45 @@ void RemoveFromOtherVehicleTickCache(const Vehicle *v) void RebuildVehicleTickCaches() { - Vehicle *si_v = nullptr; - SCOPE_INFO_FMT([&si_v], "RebuildVehicleTickCaches: %s", scope_dumper().VehicleInfo(si_v)); - ClearVehicleTickCaches(); - for (Vehicle *v : Vehicle::Iterate()) { - si_v = v; - switch (v->type) { + for (VehicleID i = 0; i < Vehicle::GetPoolSize(); i++) { + Vehicle *v = Vehicle::Get(i); + 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: _tick_other_veh_cache.push_back(v); break; 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; 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; 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; 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; case VEH_EFFECT: - _tick_effect_veh_cache.insert(v->index); + _tick_effect_veh_cache.insert(i); break; } }