diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/collision/Management/VMapManager2.cpp | 1 | ||||
-rw-r--r-- | src/server/shared/Threading/ProducerConsumerQueue.h | 2 | ||||
-rw-r--r-- | src/tools/mmaps_generator/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/tools/mmaps_generator/MapBuilder.cpp | 83 | ||||
-rw-r--r-- | src/tools/mmaps_generator/MapBuilder.h | 9 | ||||
-rw-r--r-- | src/tools/mmaps_generator/TerrainBuilder.cpp | 2 |
6 files changed, 62 insertions, 37 deletions
diff --git a/src/server/collision/Management/VMapManager2.cpp b/src/server/collision/Management/VMapManager2.cpp index 00381cb1205..1d267cbd2a5 100644 --- a/src/server/collision/Management/VMapManager2.cpp +++ b/src/server/collision/Management/VMapManager2.cpp @@ -18,7 +18,6 @@ #include <iostream> #include <iomanip> -#include <mutex> #include <string> #include <sstream> #include "VMapManager2.h" diff --git a/src/server/shared/Threading/ProducerConsumerQueue.h b/src/server/shared/Threading/ProducerConsumerQueue.h index 41bff445c2e..3fefd27ba6e 100644 --- a/src/server/shared/Threading/ProducerConsumerQueue.h +++ b/src/server/shared/Threading/ProducerConsumerQueue.h @@ -47,7 +47,7 @@ public: _condition.notify_one(); } - bool Empty() const + bool Empty() { std::lock_guard<std::mutex> lock(_queueLock); diff --git a/src/tools/mmaps_generator/CMakeLists.txt b/src/tools/mmaps_generator/CMakeLists.txt index f38ecc5144d..a2b729ca998 100644 --- a/src/tools/mmaps_generator/CMakeLists.txt +++ b/src/tools/mmaps_generator/CMakeLists.txt @@ -22,6 +22,7 @@ set(mmap_gen_Includes ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Detour/Include ${CMAKE_SOURCE_DIR}/src/server/shared ${CMAKE_SOURCE_DIR}/src/server/shared/Utilities + ${CMAKE_SOURCE_DIR}/src/server/shared/Threading ${CMAKE_SOURCE_DIR}/src/server/game/Conditions ${CMAKE_SOURCE_DIR}/src/server/collision ${CMAKE_SOURCE_DIR}/src/server/collision/Management @@ -47,6 +48,7 @@ target_link_libraries(mmaps_generator Detour ${BZIP2_LIBRARIES} ${ZLIB_LIBRARIES} + ${Boost_LIBRARIES} ) if( UNIX ) diff --git a/src/tools/mmaps_generator/MapBuilder.cpp b/src/tools/mmaps_generator/MapBuilder.cpp index fdd8a7d177a..3b1516b3d11 100644 --- a/src/tools/mmaps_generator/MapBuilder.cpp +++ b/src/tools/mmaps_generator/MapBuilder.cpp @@ -165,42 +165,59 @@ namespace MMAP } /**************************************************************************/ + + void MapBuilder::WorkerThread() + { + while (1) + { + uint32 mapId; + + _queue.WaitAndPop(mapId); + + if (_cancelationToken) + return; + + buildMap(mapId); + } + } + void MapBuilder::buildAllMaps(int threads) { + for (size_t i = 0; i < threads; ++i) + { + _workerThreads.push_back(std::thread(&MapBuilder::WorkerThread, this)); + } + + m_tiles.sort([](MapTiles a, MapTiles b) + { + return a.m_tiles->size() > b.m_tiles->size(); + }); -// TODO fix that shit -// std::vector<BuilderThread*> _threads; -// -// BuilderThreadPool* pool = threads > 0 ? new BuilderThreadPool() : NULL; -// -// m_tiles.sort([](MapTiles a, MapTiles b) -// { -// return a.m_tiles->size() > b.m_tiles->size(); -// }); -// -// for (TileList::iterator it = m_tiles.begin(); it != m_tiles.end(); ++it) -// { -// uint32 mapID = it->m_mapId; -// if (!shouldSkipMap(mapID)) -// { -// if (threads > 0) -// pool->Enqueue(new MapBuildRequest(mapID)); -// else -// buildMap(mapID); -// } -// } -// -// for (int i = 0; i < threads; ++i) -// _threads.push_back(new BuilderThread(this, pool->Queue())); -// -// // Free memory -// for (std::vector<BuilderThread*>::iterator _th = _threads.begin(); _th != _threads.end(); ++_th) -// { -// (*_th)->wait(); -// delete *_th; -// } -// -// delete pool; + for (TileList::iterator it = m_tiles.begin(); it != m_tiles.end(); ++it) + { + uint32 mapID = it->m_mapId; + if (!shouldSkipMap(mapID)) + { + if (threads > 0) + _queue.Push(mapID); + else + buildMap(mapID); + } + } + + while (!_queue.Empty()) + { + std::this_thread::sleep_for(std::chrono::milliseconds(1000)); + } + + _cancelationToken = true; + + _queue.Cancel(); + + for (auto& thread : _workerThreads) + { + thread.join(); + } } /**************************************************************************/ diff --git a/src/tools/mmaps_generator/MapBuilder.h b/src/tools/mmaps_generator/MapBuilder.h index c9ea03190a8..4cd36602a4b 100644 --- a/src/tools/mmaps_generator/MapBuilder.h +++ b/src/tools/mmaps_generator/MapBuilder.h @@ -23,12 +23,15 @@ #include <set> #include <map> #include <list> +#include <atomic> +#include <thread> #include "TerrainBuilder.h" #include "IntermediateValues.h" #include "Recast.h" #include "DetourNavMesh.h" +#include "ProducerConsumerQueue.h" using namespace VMAP; @@ -96,6 +99,8 @@ namespace MMAP // builds list of maps, then builds all of mmap tiles (based on the skip settings) void buildAllMaps(int threads); + void MapBuilder::WorkerThread(); + private: // detect maps and tiles void discoverTiles(); @@ -138,6 +143,10 @@ namespace MMAP // build performance - not really used for now rcContext* m_rcContext; + + std::vector<std::thread> _workerThreads; + ProducerConsumerQueue<uint32> _queue; + std::atomic<bool> _cancelationToken; }; } diff --git a/src/tools/mmaps_generator/TerrainBuilder.cpp b/src/tools/mmaps_generator/TerrainBuilder.cpp index 7832cef18de..771275a1757 100644 --- a/src/tools/mmaps_generator/TerrainBuilder.cpp +++ b/src/tools/mmaps_generator/TerrainBuilder.cpp @@ -18,13 +18,11 @@ #include "TerrainBuilder.h" -#include "PathCommon.h" #include "MapBuilder.h" #include "VMapManager2.h" #include "MapTree.h" #include "ModelInstance.h" -#include <vector> // ****************************************** // Map file format defines |