From a97b2ced27ecdf9bb774633d501c5528bd4b8765 Mon Sep 17 00:00:00 2001 From: elsid Date: Fri, 6 Aug 2021 19:21:52 +0200 Subject: [PATCH] Use single map to store last updates --- .../detournavigator/asyncnavmeshupdater.cpp | 25 ++++++++----------- .../detournavigator/asyncnavmeshupdater.hpp | 2 +- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/components/detournavigator/asyncnavmeshupdater.cpp b/components/detournavigator/asyncnavmeshupdater.cpp index 5e785ea56f..ce5a3ea2e6 100644 --- a/components/detournavigator/asyncnavmeshupdater.cpp +++ b/components/detournavigator/asyncnavmeshupdater.cpp @@ -65,6 +65,11 @@ namespace const auto it = std::upper_bound(queue.begin(), queue.end(), job, LessByJobPriority {}); queue.insert(it, job); } + + auto getAgentAndTile(const Job& job) noexcept + { + return std::make_tuple(job.mAgentHalfExtents, job.mChangedTile); + } } namespace DetourNavigator @@ -127,7 +132,7 @@ namespace DetourNavigator job.mDistanceToPlayer = getManhattanDistance(changedTile.first, playerTile); job.mDistanceToOrigin = getManhattanDistance(changedTile.first, TilePosition {0, 0}); job.mProcessTime = job.mChangeType == ChangeType::update - ? mLastUpdates[job.mAgentHalfExtents][job.mChangedTile] + mSettings.get().mMinUpdateInterval + ? mLastUpdates[getAgentAndTile(job)] + mSettings.get().mMinUpdateInterval : std::chrono::steady_clock::time_point(); const JobIt it = mJobs.insert(mJobs.end(), std::move(job)); @@ -387,7 +392,7 @@ namespace DetourNavigator jobs.pop_front(); if (changeLastUpdate && job->mChangeType == ChangeType::update) - mLastUpdates[job->mAgentHalfExtents][job->mChangedTile] = now; + mLastUpdates[getAgentAndTile(*job)] = now; return job; } @@ -477,20 +482,12 @@ namespace DetourNavigator const std::lock_guard lock(mMutex); - for (auto agent = mLastUpdates.begin(); agent != mLastUpdates.end();) + for (auto it = mLastUpdates.begin(); it != mLastUpdates.end();) { - for (auto tile = agent->second.begin(); tile != agent->second.end();) - { - if (now - tile->second > mSettings.get().mMinUpdateInterval) - tile = agent->second.erase(tile); - else - ++tile; - } - - if (agent->second.empty()) - agent = mLastUpdates.erase(agent); + if (now - it->second > mSettings.get().mMinUpdateInterval) + it = mLastUpdates.erase(it); else - ++agent; + ++it; } } diff --git a/components/detournavigator/asyncnavmeshupdater.hpp b/components/detournavigator/asyncnavmeshupdater.hpp index 3ad5acfb13..501212bd46 100644 --- a/components/detournavigator/asyncnavmeshupdater.hpp +++ b/components/detournavigator/asyncnavmeshupdater.hpp @@ -96,7 +96,7 @@ namespace DetourNavigator Misc::ScopeGuarded mPlayerTile; NavMeshTilesCache mNavMeshTilesCache; Misc::ScopeGuarded, std::thread::id>> mProcessingTiles; - std::map> mLastUpdates; + std::map, std::chrono::steady_clock::time_point> mLastUpdates; std::set> mPresentTiles; std::map> mThreadsQueues; std::vector mThreads;