mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-19 11:55:43 +00:00
feat(Core/Maps): Multithread startup map preloading (#22580)
This commit is contained in:
@@ -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));
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user