Support multiple threads for async nav mesh updater

pull/541/head
elsid 6 years ago
parent 7c5bedc35a
commit 7c80bb9411
No known key found for this signature in database
GPG Key ID: B845CB9FEE18AB40

@ -215,6 +215,7 @@ namespace MWWorld
navigatorSettings.mRegionMergeSize = Settings::Manager::getInt("region merge size", "Navigator");
navigatorSettings.mRegionMinSize = Settings::Manager::getInt("region min size", "Navigator");
navigatorSettings.mTileSize = Settings::Manager::getInt("tile size", "Navigator");
navigatorSettings.mAsyncNavMeshUpdaterThreads = static_cast<std::size_t>(Settings::Manager::getInt("async nav mesh updater threads", "Navigator"));
navigatorSettings.mMaxPolygonPathSize = static_cast<std::size_t>(Settings::Manager::getInt("max polygon path size", "Navigator"));
navigatorSettings.mMaxSmoothPathSize = static_cast<std::size_t>(Settings::Manager::getInt("max smooth path size", "Navigator"));
navigatorSettings.mTrianglesPerChunk = static_cast<std::size_t>(Settings::Manager::getInt("triangles per chunk", "Navigator"));

@ -55,6 +55,7 @@ namespace
mSettings.mRegionMergeSize = 20;
mSettings.mRegionMinSize = 8;
mSettings.mTileSize = 64;
mSettings.mAsyncNavMeshUpdaterThreads = 1;
mSettings.mMaxPolygonPathSize = 1024;
mSettings.mMaxSmoothPathSize = 1024;
mSettings.mTrianglesPerChunk = 256;

@ -52,8 +52,9 @@ namespace DetourNavigator
, mRecastMeshManager(recastMeshManager)
, mOffMeshConnectionsManager(offMeshConnectionsManager)
, mShouldStop()
, mThread([&] { process(); })
{
for (std::size_t i = 0; i < mSettings.get().mAsyncNavMeshUpdaterThreads; ++i)
mThreads.emplace_back([&] { process(); });
}
AsyncNavMeshUpdater::~AsyncNavMeshUpdater()
@ -63,7 +64,8 @@ namespace DetourNavigator
mJobs = decltype(mJobs)();
mHasJob.notify_all();
lock.unlock();
mThread.join();
for (auto& thread : mThreads)
thread.join();
}
void AsyncNavMeshUpdater::post(const osg::Vec3f& agentHalfExtents,

@ -71,7 +71,7 @@ namespace DetourNavigator
TilePosition mPlayerTile;
std::mutex mFirstStartMutex;
boost::optional<std::chrono::steady_clock::time_point> mFirstStart;
std::thread mThread;
std::vector<std::thread> mThreads;
void process() throw();

@ -27,6 +27,7 @@ namespace DetourNavigator
int mRegionMergeSize;
int mRegionMinSize;
int mTileSize;
std::size_t mAsyncNavMeshUpdaterThreads;
std::size_t mMaxPolygonPathSize;
std::size_t mMaxSmoothPathSize;
std::size_t mTrianglesPerChunk;

@ -585,6 +585,9 @@ region merge size = 20
# The minimum number of cells allowed to form isolated island areas. (value >= 0)
region min size = 8
# Number of background threads to update nav mesh (value >= 1)
async nav mesh updater threads = 1
# Maximum size of path over polygons (value > 0)
max polygon path size = 1024

Loading…
Cancel
Save