diff --git a/src/effectvehicle.cpp b/src/effectvehicle.cpp index bee23ac373..9a18b55c63 100644 --- a/src/effectvehicle.cpp +++ b/src/effectvehicle.cpp @@ -19,6 +19,7 @@ #include "effectvehicle_func.h" #include "effectvehicle_base.h" #include "core/checksum_func.hpp" +#include "core/container_func.hpp" #include @@ -693,22 +694,19 @@ TransparencyOption EffectVehicle::GetTransparencyOption() const return _effect_transparency_options[this->subtype]; } -extern std::vector _tick_effect_veh_cache; +extern std::vector _remove_from_tick_effect_veh_cache; +extern btree::btree_set _tick_effect_veh_cache; extern bool _tick_caches_valid; void EffectVehicle::AddEffectVehicleToTickCache() { if (!_tick_caches_valid) return; - _tick_effect_veh_cache.erase(std::remove(_tick_effect_veh_cache.begin(), _tick_effect_veh_cache.end(), nullptr), _tick_effect_veh_cache.end()); - _tick_effect_veh_cache.insert(std::upper_bound(_tick_effect_veh_cache.begin(), _tick_effect_veh_cache.end(), this, [&](const Vehicle *a, const Vehicle *b) { - return a->index < b->index; - }), this); + if (container_unordered_remove(_remove_from_tick_effect_veh_cache, this->index) > 0) return; + _tick_effect_veh_cache.insert(this->index); } void EffectVehicle::RemoveEffectVehicleFromTickCache() { if (!_tick_caches_valid) return; - for (auto &v : _tick_effect_veh_cache) { - if (v == this) v = nullptr; - } + _remove_from_tick_effect_veh_cache.push_back(this->index); } diff --git a/src/vehicle.cpp b/src/vehicle.cpp index 1aa760eeee..1b1c6f8c1f 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -1137,9 +1137,11 @@ std::vector _tick_train_front_cache; std::vector _tick_road_veh_front_cache; std::vector _tick_aircraft_front_cache; std::vector _tick_ship_cache; -std::vector _tick_effect_veh_cache; std::vector _tick_other_veh_cache; +std::vector _remove_from_tick_effect_veh_cache; +btree::btree_set _tick_effect_veh_cache; + void ClearVehicleTickCaches() { _tick_train_too_heavy_cache.clear(); @@ -1148,6 +1150,7 @@ void ClearVehicleTickCaches() _tick_aircraft_front_cache.clear(); _tick_ship_cache.clear(); _tick_effect_veh_cache.clear(); + _remove_from_tick_effect_veh_cache.clear(); _tick_other_veh_cache.clear(); } @@ -1189,7 +1192,7 @@ void RebuildVehicleTickCaches() break; case VEH_EFFECT: - _tick_effect_veh_cache.push_back(EffectVehicle::From(v)); + _tick_effect_veh_cache.insert(v->index); break; } } @@ -1209,9 +1212,11 @@ void ValidateVehicleTickCaches() std::vector saved_tick_road_veh_front_cache = std::move(_tick_road_veh_front_cache); std::vector saved_tick_aircraft_front_cache = std::move(_tick_aircraft_front_cache); std::vector saved_tick_ship_cache = std::move(_tick_ship_cache); - std::vector saved_tick_effect_veh_cache = std::move(_tick_effect_veh_cache); + btree::btree_set saved_tick_effect_veh_cache = std::move(_tick_effect_veh_cache); + for (VehicleID id : _remove_from_tick_effect_veh_cache) { + saved_tick_effect_veh_cache.erase(id); + } std::vector saved_tick_other_veh_cache = std::move(_tick_other_veh_cache); - saved_tick_effect_veh_cache.erase(std::remove(saved_tick_effect_veh_cache.begin(), saved_tick_effect_veh_cache.end(), nullptr), saved_tick_effect_veh_cache.end()); saved_tick_other_veh_cache.erase(std::remove(saved_tick_other_veh_cache.begin(), saved_tick_other_veh_cache.end(), nullptr), saved_tick_other_veh_cache.end()); RebuildVehicleTickCaches(); @@ -1279,8 +1284,12 @@ void CallVehicleTicks() Vehicle *v = nullptr; SCOPE_INFO_FMT([&v], "CallVehicleTicks: %s", scope_dumper().VehicleInfo(v)); { - for (EffectVehicle *u : _tick_effect_veh_cache) { - if (!u) continue; + for (VehicleID id : _remove_from_tick_effect_veh_cache) { + _tick_effect_veh_cache.erase(id); + } + _remove_from_tick_effect_veh_cache.clear(); + for (VehicleID id : _tick_effect_veh_cache) { + EffectVehicle *u = EffectVehicle::Get(id); v = u; u->EffectVehicle::Tick(); }