diff --git a/components/detournavigator/navmeshtilescache.cpp b/components/detournavigator/navmeshtilescache.cpp index 608ade4ab7..6434fb2637 100644 --- a/components/detournavigator/navmeshtilescache.cpp +++ b/components/detournavigator/navmeshtilescache.cpp @@ -32,16 +32,8 @@ namespace DetourNavigator ++mGetCount; - const auto agentValues = mValues.find(agentHalfExtents); - if (agentValues == mValues.end()) - return Value(); - - const auto tileValues = agentValues->second.find(changedTile); - if (tileValues == agentValues->second.end()) - return Value(); - - const auto tile = tileValues->second.mMap.find(NavMeshKeyView(recastMesh, offMeshConnections)); - if (tile == tileValues->second.mMap.end()) + const auto tile = mValues.find(std::make_tuple(agentHalfExtents, changedTile, NavMeshKeyView(recastMesh, offMeshConnections))); + if (tile == mValues.end()) return Value(); acquireItemUnsafe(tile->second); @@ -71,7 +63,7 @@ namespace DetourNavigator }; const auto iterator = mFreeItems.emplace(mFreeItems.end(), agentHalfExtents, changedTile, std::move(navMeshKey), itemSize); - const auto emplaced = mValues[agentHalfExtents][changedTile].mMap.emplace(iterator->mNavMeshKey, iterator); + const auto emplaced = mValues.emplace(std::make_tuple(agentHalfExtents, changedTile, NavMeshKeyRef(iterator->mNavMeshKey)), iterator); if (!emplaced.second) { @@ -115,32 +107,15 @@ namespace DetourNavigator { const auto& item = mFreeItems.back(); - const auto agentValues = mValues.find(item.mAgentHalfExtents); - if (agentValues == mValues.end()) - return; - - const auto tileValues = agentValues->second.find(item.mChangedTile); - if (tileValues == agentValues->second.end()) - return; - - const auto value = tileValues->second.mMap.find(item.mNavMeshKey); - if (value == tileValues->second.mMap.end()) + const auto value = mValues.find(std::make_tuple(item.mAgentHalfExtents, item.mChangedTile, NavMeshKeyRef(item.mNavMeshKey))); + if (value == mValues.end()) return; mUsedNavMeshDataSize -= item.mSize; mFreeNavMeshDataSize -= item.mSize; - tileValues->second.mMap.erase(value); + mValues.erase(value); mFreeItems.pop_back(); - - if (!tileValues->second.mMap.empty()) - return; - - agentValues->second.erase(tileValues); - if (!agentValues->second.empty()) - return; - - mValues.erase(agentValues); } void NavMeshTilesCache::acquireItemUnsafe(ItemIterator iterator) diff --git a/components/detournavigator/navmeshtilescache.hpp b/components/detournavigator/navmeshtilescache.hpp index d994bbab43..afa53beba0 100644 --- a/components/detournavigator/navmeshtilescache.hpp +++ b/components/detournavigator/navmeshtilescache.hpp @@ -110,6 +110,14 @@ namespace DetourNavigator return lhs < rhs.mRef.get(); } + template + inline bool operator <(const std::tuple& lhs, const std::tuple& rhs) + { + const auto left = std::tie(std::get<0>(lhs), std::get<1>(lhs)); + const auto right = std::tie(std::get<0>(rhs), std::get<1>(rhs)); + return std::tie(left, std::get<2>(lhs)) < std::tie(right, std::get<2>(rhs)); + } + class NavMeshTilesCache { public: @@ -211,11 +219,6 @@ namespace DetourNavigator void reportStats(unsigned int frameNumber, osg::Stats& stats) const; private: - struct TileMap - { - std::map> mMap; - }; - mutable std::mutex mMutex; std::size_t mMaxNavMeshDataSize; std::size_t mUsedNavMeshDataSize; @@ -224,7 +227,7 @@ namespace DetourNavigator std::size_t mGetCount; std::list mBusyItems; std::list mFreeItems; - std::map> mValues; + std::map, ItemIterator, std::less<>> mValues; void removeLeastRecentlyUsed();