diff options
Diffstat (limited to 'src/game')
| -rw-r--r-- | src/game/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | src/game/MapManager.cpp | 35 | ||||
| -rw-r--r-- | src/game/Unit.cpp | 1 | ||||
| -rw-r--r-- | src/game/World.cpp | 3 | ||||
| -rw-r--r-- | src/game/World.h | 2 |
5 files changed, 36 insertions, 7 deletions
diff --git a/src/game/CMakeLists.txt b/src/game/CMakeLists.txt index 621ce3def3e..6bd3c740af7 100644 --- a/src/game/CMakeLists.txt +++ b/src/game/CMakeLists.txt @@ -265,6 +265,6 @@ SET(game_STAT_SRCS GroupReference.h GroupRefManager.h ) - +add_definitions(-fopenmp) add_library(game STATIC ${game_STAT_SRCS}) ADD_DEPENDENCIES(game revision.h) diff --git a/src/game/MapManager.cpp b/src/game/MapManager.cpp index 6a8cd130691..5a66ab6cea8 100644 --- a/src/game/MapManager.cpp +++ b/src/game/MapManager.cpp @@ -18,6 +18,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include <omp.h> #include "MapManager.h" #include "InstanceSaveMgr.h" #include "Policies/SingletonImp.h" @@ -248,12 +249,25 @@ MapManager::Update(time_t diff) ObjectAccessor::Instance().UpdatePlayers(i_timer.GetCurrent()); sWorld.RecordTimeDiff("UpdatePlayers"); - - for(MapMapType::iterator iter=i_maps.begin(); iter != i_maps.end(); ++iter) + uint32 i=0; + MapMapType::iterator iter; + std::vector<Map*> update_queue(i_maps.size()); + omp_set_num_threads(sWorld.getConfig(CONFIG_NUMTHREADS)); + for(iter = i_maps.begin(), i=0;iter != i_maps.end(); ++iter, i++) + update_queue[i]=iter->second; +/* + gomp in gcc <4.4 version cannot parallelise loops using random access iterators + so until gcc 4.4 isnt standard, we need the update_queue workaround +*/ + +#pragma omp parallel for schedule(dynamic) private(i) shared(update_queue) + for(int32 i = 0; i < i_maps.size(); ++i) { checkAndCorrectGridStatesArray(); // debugging code, should be deleted some day - iter->second->Update(i_timer.GetCurrent()); - sWorld.RecordTimeDiff("UpdateMap %u", iter->second->GetId()); + update_queue[i]->Update(i_timer.GetCurrent()); + sWorld.RecordTimeDiff("UpdateMap %u", update_queue[i]->GetId()); + // sLog.outError("This is thread %d out of %d threads,updating map %u",omp_get_thread_num(),omp_get_num_threads(),iter->second->GetId()); + } ObjectAccessor::Instance().Update(i_timer.GetCurrent()); @@ -267,8 +281,17 @@ MapManager::Update(time_t diff) void MapManager::DoDelayedMovesAndRemoves() { - for(MapMapType::iterator iter=i_maps.begin(); iter != i_maps.end(); ++iter) - iter->second->DoDelayedMovesAndRemoves(); + int i =0; + std::vector<Map*> update_queue(i_maps.size()); + MapMapType::iterator iter; + for(iter = i_maps.begin();iter != i_maps.end(); ++iter, i++) + update_queue[i] = iter->second; + + omp_set_num_threads(sWorld.getConfig(CONFIG_NUMTHREADS)); + +#pragma omp parallel for schedule(dynamic) private(i) shared(update_queue) + for(i=0;i<i_maps.size();i++) + update_queue[i]->DoDelayedMovesAndRemoves(); } bool MapManager::ExistMapAndVMap(uint32 mapid, float x,float y) diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index e07b2aef98a..23cde7b2fc6 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -18,6 +18,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include <omp.h> #include "Common.h" #include "Log.h" #include "Opcodes.h" diff --git a/src/game/World.cpp b/src/game/World.cpp index c0f815e8888..fb8d78fe0af 100644 --- a/src/game/World.cpp +++ b/src/game/World.cpp @@ -1029,6 +1029,7 @@ void World::LoadConfigSettings(bool reload) m_configs[CONFIG_SHOW_KICK_IN_WORLD] = sConfig.GetBoolDefault("ShowKickInWorld", false); m_configs[CONFIG_INTERVAL_LOG_UPDATE] = sConfig.GetIntDefault("RecordUpdateTimeDiffInterval", 60000); m_configs[CONFIG_MIN_LOG_UPDATE] = sConfig.GetIntDefault("MinRecordUpdateTimeDiff", 10); + m_configs[CONFIG_NUMTHREADS] = sConfig.GetIntDefault("MapUpdate.Threads",1); std::string forbiddenmaps = sConfig.GetStringDefault("ForbiddenMaps", ""); char * forbiddenMaps = new char[forbiddenmaps.length() + 1]; @@ -1596,8 +1597,10 @@ void World::Update(time_t diff) sBattleGroundMgr.Update(diff); RecordTimeDiff("UpdateBattleGroundMgr"); + sOutdoorPvPMgr.Update(diff); RecordTimeDiff("UpdateOutdoorPvPMgr"); + } RecordTimeDiff(NULL); diff --git a/src/game/World.h b/src/game/World.h index 32af277c8f5..1badcb36054 100644 --- a/src/game/World.h +++ b/src/game/World.h @@ -208,6 +208,8 @@ enum WorldConfigs CONFIG_ENABLE_SINFO_LOGIN, CONFIG_PREMATURE_BG_REWARD, CONFIG_PET_LOS, + CONFIG_NUMTHREADS, + CONFIG_VALUE_COUNT }; |
