mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-03-26 11:37:12 +00:00
Use single map for navmesh cache
This commit is contained in:
parent
b9a40bc5fc
commit
05d6f6ac25
@ -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…
x
Reference in New Issue
Block a user