From ab55aa4e5a3223ada9a0593dd4cbcb7a37fc5bc4 Mon Sep 17 00:00:00 2001 From: Stoabrogga <38475780+Stoabrogga@users.noreply.github.com> Date: Mon, 30 Sep 2019 17:06:32 +0200 Subject: [PATCH] feat(Core/Config): Add parameter to load all grids of all non-instanced maps on server start (#2283) --- src/server/game/Maps/Map.cpp | 7 +++++ src/server/game/Maps/Map.h | 1 + src/server/game/World/World.cpp | 24 +++++++++++++++++ src/server/game/World/World.h | 1 + src/server/worldserver/worldserver.conf.dist | 28 +++++++++----------- 5 files changed, 45 insertions(+), 16 deletions(-) diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index ba37dfd3f..2045693d0 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -469,6 +469,13 @@ void Map::LoadGrid(float x, float y) EnsureGridLoaded(Cell(x, y)); } +void Map::LoadAllCells() +{ + for (uint32 cellX = 0; cellX < TOTAL_NUMBER_OF_CELLS_PER_MAP; cellX++) + for (uint32 cellY = 0; cellY < TOTAL_NUMBER_OF_CELLS_PER_MAP; cellY++) + LoadGrid((cellX + 0.5f - CENTER_GRID_CELL_ID) * SIZE_OF_GRID_CELL, (cellY + 0.5f - CENTER_GRID_CELL_ID) * SIZE_OF_GRID_CELL); +} + bool Map::AddPlayerToMap(Player* player) { CellCoord cellCoord = Trinity::ComputeCellCoord(player->GetPositionX(), player->GetPositionY()); diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h index a090b7bfa..d626ede2b 100644 --- a/src/server/game/Maps/Map.h +++ b/src/server/game/Maps/Map.h @@ -319,6 +319,7 @@ class Map : public GridRefManager } void LoadGrid(float x, float y); + void LoadAllCells(); bool UnloadGrid(NGridType& ngrid); virtual void UnloadAll(); diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index d568ea1c5..fe02de711 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1326,6 +1326,9 @@ void World::LoadConfigSettings(bool reload) // Prevent players AFK from being logged out m_int_configs[CONFIG_AFK_PREVENT_LOGOUT] = sConfigMgr->GetIntDefault("PreventAFKLogout", 0); + // Preload all grids of all non-instanced maps + m_bool_configs[CONFIG_PRELOAD_ALL_NON_INSTANCED_MAP_GRIDS] = sConfigMgr->GetIntDefault("PreloadAllNonInstancedMapGrids", false); + // call ScriptMgr if we're reloading the configuration sScriptMgr->OnAfterConfigLoad(reload); } @@ -1958,6 +1961,27 @@ void World::SetInitialWorldSettings() sEluna->RunScripts(); sEluna->OnConfigLoad(false,false); // Must be done after Eluna is initialized and scripts have run. #endif + + if (sWorld->getBoolConfig(CONFIG_PRELOAD_ALL_NON_INSTANCED_MAP_GRIDS)) + { + sLog->outString("Loading all grids for all non-instanced maps..."); + + for (uint32 i = 0; i < sMapStore.GetNumRows(); ++i) + { + MapEntry const* mapEntry = sMapStore.LookupEntry(i); + + if (mapEntry && !mapEntry->Instanceable()) + { + Map* map = sMapMgr->CreateBaseMap(mapEntry->MapID); + + if (map) + { + sLog->outString(">> Loading all grids for map %u", map->GetId()); + map->LoadAllCells(); + } + } + } + } uint32 startupDuration = GetMSTimeDiffToNow(startupBegin); sLog->outString(); diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index ae779a039..6776ded13 100644 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -169,6 +169,7 @@ enum WorldBoolConfigs CONFIG_CHECK_GOBJECT_LOS, CONFIG_CLOSE_IDLE_CONNECTIONS, CONFIG_LFG_LOCATION_ALL, // Player can join LFG anywhere + CONFIG_PRELOAD_ALL_NON_INSTANCED_MAP_GRIDS, BOOL_CONFIG_VALUE_COUNT }; diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist index 900d5c7d4..7f0d0cce4 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -203,15 +203,6 @@ SaveRespawnTimeImmediately = 1 MaxOverspeedPings = 2 -# -# GridUnload -# Description: Unload grids to save memory. Can be disabled if enough memory is available -# to speed up moving players to new grids. -# Default: 1 - (enable, Unload grids) -# 0 - (disable, Do not unload grids) - -GridUnload = 1 - # # CloseIdleConnections # Description: Automatically close idle connections. @@ -246,13 +237,6 @@ SocketTimeOutTimeActive = 60000 SessionAddDelay = 10000 -# -# GridCleanUpDelay -# Description: Time (in milliseconds) grid clean up delay. -# Default: 300000 - (5 minutes) - -GridCleanUpDelay = 300000 - # # MapUpdateInterval # Description: Time (milliseconds) for map update interval. @@ -416,6 +400,18 @@ CleanCharacterDB = 0 PersistentCharacterCleanFlags = 0 +# +# PreloadAllNonInstancedMapGrids +# Description: Preload all grids on all non-instanced maps. This will take a great amount +# of additional RAM (ca. 9 GB) and causes the server to take longer to start, +# but can increase performance if used on a server with a high amount of players. +# It will also activate all creatures which are set active (e.g. the Fel Reavers +# in Hellfire Peninsula) on server start. +# Default: 0 - (Disabled) +# 1 - (Enabled) + +PreloadAllNonInstancedMapGrids = 0 + # ###################################################################################################