Refactor effect vehicle cache to reduce cost of inserts/removes

This commit is contained in:
Jonathan G Rennison
2019-10-04 18:46:27 +01:00
parent ac5139343a
commit 455e694e79
2 changed files with 21 additions and 14 deletions

View File

@@ -19,6 +19,7 @@
#include "effectvehicle_func.h"
#include "effectvehicle_base.h"
#include "core/checksum_func.hpp"
#include "core/container_func.hpp"
#include <algorithm>
@@ -693,22 +694,19 @@ TransparencyOption EffectVehicle::GetTransparencyOption() const
return _effect_transparency_options[this->subtype];
}
extern std::vector<EffectVehicle *> _tick_effect_veh_cache;
extern std::vector<VehicleID> _remove_from_tick_effect_veh_cache;
extern btree::btree_set<VehicleID> _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);
}