mirror of
https://github.com/OpenMW/openmw.git
synced 2025-02-21 06:39:42 +00:00
Use single set to store pushed jobs for tiles
This commit is contained in:
parent
a99266a60e
commit
8db640289c
2 changed files with 22 additions and 31 deletions
|
@ -173,8 +173,6 @@ namespace DetourNavigator
|
|||
return true;
|
||||
}
|
||||
minDistanceToPlayer = getMinDistanceTo(playerPosition, maxDistanceToPlayer, mPushed, mPresentTiles);
|
||||
for (const auto& [threadId, queue] : mThreadsQueues)
|
||||
minDistanceToPlayer = getMinDistanceTo(playerPosition, minDistanceToPlayer, queue.mPushed, mPresentTiles);
|
||||
return minDistanceToPlayer >= maxDistanceToPlayer;
|
||||
};
|
||||
std::unique_lock<std::mutex> lock(mMutex);
|
||||
|
@ -319,7 +317,7 @@ namespace DetourNavigator
|
|||
{
|
||||
const auto hasJob = [&] {
|
||||
return (!mJobs.empty() && mJobs.front().mProcessTime <= std::chrono::steady_clock::now())
|
||||
|| !threadQueue.mJobs.empty();
|
||||
|| !threadQueue.empty();
|
||||
};
|
||||
|
||||
if (!mHasJob.wait_for(lock, std::chrono::milliseconds(10), hasJob))
|
||||
|
@ -330,11 +328,11 @@ namespace DetourNavigator
|
|||
}
|
||||
|
||||
Log(Debug::Debug) << "Got " << mJobs.size() << " navigator jobs and "
|
||||
<< threadQueue.mJobs.size() << " thread jobs by thread=" << std::this_thread::get_id();
|
||||
<< threadQueue.size() << " thread jobs by thread=" << std::this_thread::get_id();
|
||||
|
||||
auto job = threadQueue.mJobs.empty()
|
||||
? getJob(mJobs, mPushed, true)
|
||||
: getJob(threadQueue.mJobs, threadQueue.mPushed, false);
|
||||
auto job = threadQueue.empty()
|
||||
? getJob(mJobs, true)
|
||||
: getJob(threadQueue, false);
|
||||
|
||||
if (!job)
|
||||
continue;
|
||||
|
@ -342,13 +340,22 @@ namespace DetourNavigator
|
|||
const auto owner = lockTile(job->mAgentHalfExtents, job->mChangedTile);
|
||||
|
||||
if (owner == threadId)
|
||||
{
|
||||
const auto it = mPushed.find(job->mAgentHalfExtents);
|
||||
if (it != mPushed.end())
|
||||
{
|
||||
it->second.erase(job->mChangedTile);
|
||||
if (it->second.empty())
|
||||
mPushed.erase(it);
|
||||
}
|
||||
return job;
|
||||
}
|
||||
|
||||
postThreadJob(std::move(*job), mThreadsQueues[owner]);
|
||||
}
|
||||
}
|
||||
|
||||
std::optional<AsyncNavMeshUpdater::Job> AsyncNavMeshUpdater::getJob(Jobs& jobs, Pushed& pushed, bool changeLastUpdate)
|
||||
std::optional<AsyncNavMeshUpdater::Job> AsyncNavMeshUpdater::getJob(Jobs& jobs, bool changeLastUpdate)
|
||||
{
|
||||
const auto now = std::chrono::steady_clock::now();
|
||||
|
||||
|
@ -361,11 +368,6 @@ namespace DetourNavigator
|
|||
if (changeLastUpdate && job.mChangeType == ChangeType::update)
|
||||
mLastUpdates[job.mAgentHalfExtents][job.mChangedTile] = now;
|
||||
|
||||
const auto it = pushed.find(job.mAgentHalfExtents);
|
||||
it->second.erase(job.mChangedTile);
|
||||
if (it->second.empty())
|
||||
pushed.erase(it);
|
||||
|
||||
return job;
|
||||
}
|
||||
|
||||
|
@ -407,13 +409,10 @@ namespace DetourNavigator
|
|||
}
|
||||
}
|
||||
|
||||
void AsyncNavMeshUpdater::postThreadJob(Job&& job, Queue& queue)
|
||||
void AsyncNavMeshUpdater::postThreadJob(Job&& job, Jobs& queue)
|
||||
{
|
||||
if (queue.mPushed[job.mAgentHalfExtents].insert(job.mChangedTile).second)
|
||||
{
|
||||
queue.mJobs.push_back(std::move(job));
|
||||
mHasJob.notify_all();
|
||||
}
|
||||
queue.push_back(std::move(job));
|
||||
mHasJob.notify_all();
|
||||
}
|
||||
|
||||
std::thread::id AsyncNavMeshUpdater::lockTile(const osg::Vec3f& agentHalfExtents, const TilePosition& changedTile)
|
||||
|
@ -475,7 +474,7 @@ namespace DetourNavigator
|
|||
std::size_t AsyncNavMeshUpdater::getTotalThreadJobsUnsafe() const
|
||||
{
|
||||
return std::accumulate(mThreadsQueues.begin(), mThreadsQueues.end(), std::size_t(0),
|
||||
[] (auto r, const auto& v) { return r + v.second.mJobs.size(); });
|
||||
[] (auto r, const auto& v) { return r + v.second.size(); });
|
||||
}
|
||||
|
||||
void AsyncNavMeshUpdater::cleanupLastUpdates()
|
||||
|
|
|
@ -92,14 +92,6 @@ namespace DetourNavigator
|
|||
using Jobs = std::deque<Job>;
|
||||
using Pushed = std::map<osg::Vec3f, std::set<TilePosition>>;
|
||||
|
||||
struct Queue
|
||||
{
|
||||
Jobs mJobs;
|
||||
Pushed mPushed;
|
||||
|
||||
Queue() = default;
|
||||
};
|
||||
|
||||
std::reference_wrapper<const Settings> mSettings;
|
||||
std::reference_wrapper<TileCachedRecastMeshManager> mRecastMeshManager;
|
||||
std::reference_wrapper<OffMeshConnectionsManager> mOffMeshConnectionsManager;
|
||||
|
@ -115,7 +107,7 @@ namespace DetourNavigator
|
|||
Misc::ScopeGuarded<std::map<osg::Vec3f, std::map<TilePosition, std::thread::id>>> mProcessingTiles;
|
||||
std::map<osg::Vec3f, std::map<TilePosition, std::chrono::steady_clock::time_point>> mLastUpdates;
|
||||
std::set<std::tuple<osg::Vec3f, TilePosition>> mPresentTiles;
|
||||
std::map<std::thread::id, Queue> mThreadsQueues;
|
||||
std::map<std::thread::id, Jobs> mThreadsQueues;
|
||||
std::vector<std::thread> mThreads;
|
||||
|
||||
void process() noexcept;
|
||||
|
@ -124,9 +116,9 @@ namespace DetourNavigator
|
|||
|
||||
std::optional<Job> getNextJob();
|
||||
|
||||
std::optional<Job> getJob(Jobs& jobs, Pushed& pushed, bool changeLastUpdate);
|
||||
std::optional<Job> getJob(Jobs& jobs, bool changeLastUpdate);
|
||||
|
||||
void postThreadJob(Job&& job, Queue& queue);
|
||||
void postThreadJob(Job&& job, Jobs& queue);
|
||||
|
||||
void writeDebugFiles(const Job& job, const RecastMesh* recastMesh) const;
|
||||
|
||||
|
|
Loading…
Reference in a new issue