mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-10-25 07:56:37 +00:00 
			
		
		
		
	Use single map for navmesh cache
This commit is contained in:
		
							parent
							
								
									b9a40bc5fc
								
							
						
					
					
						commit
						05d6f6ac25
					
				
					 2 changed files with 15 additions and 37 deletions
				
			
		|  | @ -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) | ||||
|  |  | |||
|  | @ -110,6 +110,14 @@ namespace DetourNavigator | |||
|         return lhs < rhs.mRef.get(); | ||||
|     } | ||||
| 
 | ||||
|     template <class L, class R> | ||||
|     inline bool operator <(const std::tuple<osg::Vec3f, TilePosition, L>& lhs, const std::tuple<osg::Vec3f, TilePosition, R>& 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<NavMeshKeyRef, ItemIterator, std::less<>> 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<Item> mBusyItems; | ||||
|         std::list<Item> mFreeItems; | ||||
|         std::map<osg::Vec3f, std::map<TilePosition, TileMap>> mValues; | ||||
|         std::map<std::tuple<osg::Vec3f, TilePosition, NavMeshKeyRef>, ItemIterator, std::less<>> mValues; | ||||
| 
 | ||||
|         void removeLeastRecentlyUsed(); | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue