aboutsummaryrefslogtreecommitdiff
path: root/src/game
diff options
context:
space:
mode:
Diffstat (limited to 'src/game')
-rw-r--r--src/game/CMakeLists.txt2
-rw-r--r--src/game/MapManager.cpp41
-rw-r--r--src/game/World.cpp3
-rw-r--r--src/game/World.h1
4 files changed, 43 insertions, 4 deletions
diff --git a/src/game/CMakeLists.txt b/src/game/CMakeLists.txt
index 339594bc4f9..bb05b4d6076 100644
--- a/src/game/CMakeLists.txt
+++ b/src/game/CMakeLists.txt
@@ -294,6 +294,6 @@ SET(game_STAT_SRCS
Wintergrasp.cpp
ZoneScript.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 ece2876cab4..0da0d003144 100644
--- a/src/game/MapManager.cpp
+++ b/src/game/MapManager.cpp
@@ -18,6 +18,9 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
+#ifdef MULTI_THREAD_MAP
+#include <omp.h>
+#endif
#include "MapManager.h"
#include "InstanceSaveMgr.h"
#include "Policies/SingletonImp.h"
@@ -251,12 +254,33 @@ MapManager::Update(uint32 diff)
if( !i_timer.Passed() )
return;
- for(MapMapType::iterator iter=i_maps.begin(); iter != i_maps.end(); ++iter)
+#ifdef MULTI_THREAD_MAP
+ 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
+ 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());
+
+ }
+#else
+ for(MapMapType::iterator iter=i_maps.begin(); iter != i_maps.end(); ++iter)
+ {
iter->second->Update(i_timer.GetCurrent());
sWorld.RecordTimeDiff("UpdateMap %u", iter->second->GetId());
}
+#endif
ObjectAccessor::Instance().Update(i_timer.GetCurrent());
sWorld.RecordTimeDiff("UpdateObjectAccessor");
@@ -269,8 +293,19 @@ MapManager::Update(uint32 diff)
void MapManager::DoDelayedMovesAndRemoves()
{
- for(MapMapType::iterator iter=i_maps.begin(); iter != i_maps.end(); ++iter)
- iter->second->RelocationNotify();
+ /*
+ 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/World.cpp b/src/game/World.cpp
index 150b2285191..3b72d0d2d02 100644
--- a/src/game/World.cpp
+++ b/src/game/World.cpp
@@ -1088,6 +1088,7 @@ void World::LoadConfigSettings(bool reload)
m_configs[CONFIG_INTERVAL_LOG_UPDATE] = sConfig.GetIntDefault("RecordUpdateTimeDiffInterval", 60000);
m_configs[CONFIG_MIN_LOG_UPDATE] = sConfig.GetIntDefault("MinRecordUpdateTimeDiff", 10);
m_configs[CONFIG_CHECK_DB] = sConfig.GetBoolDefault("CheckDB", true);
+ m_configs[CONFIG_NUMTHREADS] = sConfig.GetIntDefault("MapUpdate.Threads",1);
std::string forbiddenmaps = sConfig.GetStringDefault("ForbiddenMaps", "");
char * forbiddenMaps = new char[forbiddenmaps.length() + 1];
@@ -1784,9 +1785,11 @@ void World::Update(uint32 diff)
sBattleGroundMgr.Update(diff);
RecordTimeDiff("UpdateBattleGroundMgr");
+
sOutdoorPvPMgr.Update(diff);
RecordTimeDiff("UpdateOutdoorPvPMgr");
+
// execute callbacks from sql queries that were queued recently
UpdateResultQueue();
RecordTimeDiff("UpdateResultQueue");
diff --git a/src/game/World.h b/src/game/World.h
index c91ee2e70ec..d8bb7477568 100644
--- a/src/game/World.h
+++ b/src/game/World.h
@@ -235,6 +235,7 @@ enum WorldConfigs
CONFIG_CHECK_DB,
CONFIG_ENABLE_SINFO_LOGIN,
CONFIG_PET_LOS,
+ CONFIG_NUMTHREADS,
CONFIG_OFFHAND_CHECK_AT_TALENTS_RESET,
CONFIG_CHATLOG_CHANNEL,
CONFIG_CHATLOG_WHISPER,