From 57dacae38b37f1230fa6bea03252d345cb7cf4dd Mon Sep 17 00:00:00 2001 From: Takenbacon Date: Tue, 29 Jul 2025 05:10:46 -0700 Subject: [PATCH] feat(Core/Maps): Multithread startup map preloading (#22580) --- src/server/game/Maps/MapUpdater.cpp | 28 ++++++++++++++++++++++++++++ src/server/game/Maps/MapUpdater.h | 1 + src/server/game/World/World.cpp | 18 +++++++++++++----- 3 files changed, 42 insertions(+), 5 deletions(-) diff --git a/src/server/game/Maps/MapUpdater.cpp b/src/server/game/Maps/MapUpdater.cpp index 8f8704da5..ea5fe9602 100644 --- a/src/server/game/Maps/MapUpdater.cpp +++ b/src/server/game/Maps/MapUpdater.cpp @@ -18,7 +18,9 @@ #include "MapUpdater.h" #include "DatabaseEnv.h" #include "LFGMgr.h" +#include "Log.h" #include "Map.h" +#include "MapMgr.h" #include "Metric.h" class UpdateRequest @@ -52,6 +54,27 @@ private: uint32 s_diff; }; +class MapPreloadRequest : public UpdateRequest +{ +public: + MapPreloadRequest(uint32 mapId, MapUpdater& updater) + : _mapId(mapId), _updater(updater) + { + } + + void call() override + { + Map* map = sMapMgr->CreateBaseMap(_mapId); + LOG_INFO("server.loading", ">> Loading All Grids For Map {} ({})", map->GetId(), map->GetMapName()); + map->LoadAllGrids(); + _updater.update_finished(); + } + +private: + uint32 _mapId; + MapUpdater& _updater; +}; + class LFGUpdateRequest : public UpdateRequest { public: @@ -120,6 +143,11 @@ void MapUpdater::schedule_update(Map& map, uint32 diff, uint32 s_diff) schedule_task(new MapUpdateRequest(map, *this, diff, s_diff)); } +void MapUpdater::schedule_map_preload(uint32 mapid) +{ + schedule_task(new MapPreloadRequest(mapid, *this)); +} + void MapUpdater::schedule_lfg_update(uint32 diff) { schedule_task(new LFGUpdateRequest(*this, diff)); diff --git a/src/server/game/Maps/MapUpdater.h b/src/server/game/Maps/MapUpdater.h index 174cef977..9576e7e1f 100644 --- a/src/server/game/Maps/MapUpdater.h +++ b/src/server/game/Maps/MapUpdater.h @@ -35,6 +35,7 @@ public: void schedule_task(UpdateRequest* request); void schedule_update(Map& map, uint32 diff, uint32 s_diff); + void schedule_map_preload(uint32 mapid); void schedule_lfg_update(uint32 diff); void wait(); void activate(std::size_t num_threads); diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 0ef09fdf2..4a7044993 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1010,15 +1010,23 @@ void World::SetInitialWorldSettings() if (mapEntry && !mapEntry->Instanceable()) { - Map* map = sMapMgr->CreateBaseMap(mapEntry->MapID); - - if (map) + if (sMapMgr->GetMapUpdater()->activated()) + sMapMgr->GetMapUpdater()->schedule_map_preload(mapEntry->MapID); + else { - LOG_INFO("server.loading", ">> Loading All Grids For Map {}", map->GetId()); - map->LoadAllGrids(); + Map* map = sMapMgr->CreateBaseMap(mapEntry->MapID); + + if (map) + { + LOG_INFO("server.loading", ">> Loading All Grids For Map {}", map->GetId()); + map->LoadAllGrids(); + } } } } + + if (sMapMgr->GetMapUpdater()->activated()) + sMapMgr->GetMapUpdater()->wait(); } uint32 startupDuration = GetMSTimeDiffToNow(startupBegin);