From c95aa557c2b66157448d1a9eb926caea15750f77 Mon Sep 17 00:00:00 2001 From: Jiga228 Date: Sun, 28 Jun 2026 20:29:19 +0700 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20World=20?= =?UTF-8?q?=D0=BF=D0=BE=D1=82=D0=BE=D0=BA=D0=BE=D0=B1=D0=B5=D0=B7=D0=BE?= =?UTF-8?q?=D0=BF=D0=B0=D1=81=D0=BD=D1=8B=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Core/Game/World/World.cpp | 19 +++++++++++-------- Core/Game/World/World.hpp | 20 +++++++++++++------- 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/Core/Game/World/World.cpp b/Core/Game/World/World.cpp index eaf344c..36ddb9e 100644 --- a/Core/Game/World/World.cpp +++ b/Core/Game/World/World.cpp @@ -8,31 +8,32 @@ World::World(GameInstance& game_instance) : game_instance_(game_instance) World::~World() { - for (auto& i : actors_map) + for (auto& i : actors_map_) i.second->OnDestroy(); - actors_map.clear(); + actors_map_.clear(); } void World::BeginPlay() { - for (auto& i : actors_map) + for (auto& i : actors_map_) i.second->BeginPlay(); } void World::Tick(double delta_time) { - for (auto& i : actors_map) + for (auto& i : actors_map_) i.second->Tick(delta_time); } std::shared_ptr World::save() { + std::scoped_lock lock(m_actors_map_); std::shared_ptr save = std::make_shared("World"); std::vector ActorsIDs; - ActorsIDs.reserve(actors_map.size()); + ActorsIDs.reserve(actors_map_.size()); std::list> actors; - for (auto[it, flag] : actors_map) + for (auto[it, flag] : actors_map_) { ActorsIDs.push_back(it); actors.push_back(flag); @@ -45,13 +46,14 @@ std::shared_ptr World::save() void World::load(std::shared_ptr save) { + std::scoped_lock lock(m_actors_map_); std::vector actors_IDs = save->GetVectorString("ActorsIDs"); std::list> act = save->GetListObject("Actors"); size_t i_id = 0; for (auto& i : act) { - auto[it, flag] = actors_map.try_emplace(actors_IDs[i_id], std::static_pointer_cast(i)); + auto[it, flag] = actors_map_.try_emplace(actors_IDs[i_id], std::static_pointer_cast(i)); it->second->world_ = std::static_pointer_cast(shared_from_this()); it->second->name_ = it->first; i_id++; @@ -60,11 +62,12 @@ void World::load(std::shared_ptr save) void World::DestroyActor(std::weak_ptr ptr) { + std::scoped_lock lock(m_actors_map_); std::shared_ptr actor = ptr.lock(); if (actor == nullptr) return; std::string name = actor->GetName(); actor->OnDestroy(); - actors_map.erase(name); + actors_map_.erase(name); } diff --git a/Core/Game/World/World.hpp b/Core/Game/World/World.hpp index 68f7d50..c0291da 100644 --- a/Core/Game/World/World.hpp +++ b/Core/Game/World/World.hpp @@ -4,6 +4,7 @@ #include #include #include +#include #include "RTTI.h" #include "Game/Actors/Actor.hpp" @@ -15,8 +16,9 @@ class World : public ISave { GameInstance& game_instance_; - std::unordered_map> actors_map; - + std::unordered_map> actors_map_; + std::mutex m_actors_map_; + public: World(GameInstance& game_instance); ~World() override; @@ -34,8 +36,9 @@ public: template class Container = std::vector> Container> GetActorsByClass() { + std::scoped_lock lock(m_actors_map_); Container> list; - for (auto i = actors_map.cbegin(); i != actors_map.cend(); ++i) + for (auto i = actors_map_.cbegin(); i != actors_map_.cend(); ++i) { if (RTTI::dyn_cast(i->second.get())) list.push_back(std::static_pointer_cast(i->second)); @@ -46,12 +49,13 @@ public: template std::weak_ptr SpawnActorFormClass(std::string name, const Vector3D& loc = { 0, 0, 0 }, const Vector3D& rot = { 0, 0, 0 }) { + std::scoped_lock lock(m_actors_map_); std::shared_ptr object = std::make_shared(); object->SetActorLocate(loc); object->SetActorRotate(rot); std::static_pointer_cast(object)->world_ = std::static_pointer_cast(shared_from_this()); std::static_pointer_cast(object)->name_ = name; - actors_map.try_emplace(name, object); + actors_map_.try_emplace(name, object); return object; } @@ -60,9 +64,10 @@ public: template class Container = std::vector> Container> GetActorsByTag(std::string tag) { + std::scoped_lock lock(m_actors_map_); Container> container; - for (auto& i : actors_map) + for (auto& i : actors_map_) { if (RTTI::dyn_cast(i.second.get())) { @@ -81,8 +86,9 @@ public: template std::weak_ptr GetActorByName(const std::string& name) { - auto it = actors_map.find(name); - if (it == actors_map.end() || it->second == nullptr) + std::scoped_lock lock(m_actors_map_); + auto it = actors_map_.find(name); + if (it == actors_map_.end() || it->second == nullptr) return {}; return std::static_pointer_cast(it->second);