feat(Core/Maps): Multithread startup map preloading (#22580)
This commit is contained in:
@@ -18,7 +18,9 @@
|
|||||||
#include "MapUpdater.h"
|
#include "MapUpdater.h"
|
||||||
#include "DatabaseEnv.h"
|
#include "DatabaseEnv.h"
|
||||||
#include "LFGMgr.h"
|
#include "LFGMgr.h"
|
||||||
|
#include "Log.h"
|
||||||
#include "Map.h"
|
#include "Map.h"
|
||||||
|
#include "MapMgr.h"
|
||||||
#include "Metric.h"
|
#include "Metric.h"
|
||||||
|
|
||||||
class UpdateRequest
|
class UpdateRequest
|
||||||
@@ -52,6 +54,27 @@ private:
|
|||||||
uint32 s_diff;
|
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
|
class LFGUpdateRequest : public UpdateRequest
|
||||||
{
|
{
|
||||||
public:
|
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));
|
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)
|
void MapUpdater::schedule_lfg_update(uint32 diff)
|
||||||
{
|
{
|
||||||
schedule_task(new LFGUpdateRequest(*this, diff));
|
schedule_task(new LFGUpdateRequest(*this, diff));
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ public:
|
|||||||
|
|
||||||
void schedule_task(UpdateRequest* request);
|
void schedule_task(UpdateRequest* request);
|
||||||
void schedule_update(Map& map, uint32 diff, uint32 s_diff);
|
void schedule_update(Map& map, uint32 diff, uint32 s_diff);
|
||||||
|
void schedule_map_preload(uint32 mapid);
|
||||||
void schedule_lfg_update(uint32 diff);
|
void schedule_lfg_update(uint32 diff);
|
||||||
void wait();
|
void wait();
|
||||||
void activate(std::size_t num_threads);
|
void activate(std::size_t num_threads);
|
||||||
|
|||||||
@@ -1010,15 +1010,23 @@ void World::SetInitialWorldSettings()
|
|||||||
|
|
||||||
if (mapEntry && !mapEntry->Instanceable())
|
if (mapEntry && !mapEntry->Instanceable())
|
||||||
{
|
{
|
||||||
Map* map = sMapMgr->CreateBaseMap(mapEntry->MapID);
|
if (sMapMgr->GetMapUpdater()->activated())
|
||||||
|
sMapMgr->GetMapUpdater()->schedule_map_preload(mapEntry->MapID);
|
||||||
if (map)
|
else
|
||||||
{
|
{
|
||||||
LOG_INFO("server.loading", ">> Loading All Grids For Map {}", map->GetId());
|
Map* map = sMapMgr->CreateBaseMap(mapEntry->MapID);
|
||||||
map->LoadAllGrids();
|
|
||||||
|
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);
|
uint32 startupDuration = GetMSTimeDiffToNow(startupBegin);
|
||||||
|
|||||||
Reference in New Issue
Block a user