mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-03-31 19:20:26 +00:00
Use single map for navmesh cache
This commit is contained in:
parent
b9a40bc5fc
commit
05d6f6ac25
@ -32,16 +32,8 @@ namespace DetourNavigator
|
|||||||
|
|
||||||
++mGetCount;
|
++mGetCount;
|
||||||
|
|
||||||
const auto agentValues = mValues.find(agentHalfExtents);
|
const auto tile = mValues.find(std::make_tuple(agentHalfExtents, changedTile, NavMeshKeyView(recastMesh, offMeshConnections)));
|
||||||
if (agentValues == mValues.end())
|
if (tile == 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())
|
|
||||||
return Value();
|
return Value();
|
||||||
|
|
||||||
acquireItemUnsafe(tile->second);
|
acquireItemUnsafe(tile->second);
|
||||||
@ -71,7 +63,7 @@ namespace DetourNavigator
|
|||||||
};
|
};
|
||||||
|
|
||||||
const auto iterator = mFreeItems.emplace(mFreeItems.end(), agentHalfExtents, changedTile, std::move(navMeshKey), itemSize);
|
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)
|
if (!emplaced.second)
|
||||||
{
|
{
|
||||||
@ -115,32 +107,15 @@ namespace DetourNavigator
|
|||||||
{
|
{
|
||||||
const auto& item = mFreeItems.back();
|
const auto& item = mFreeItems.back();
|
||||||
|
|
||||||
const auto agentValues = mValues.find(item.mAgentHalfExtents);
|
const auto value = mValues.find(std::make_tuple(item.mAgentHalfExtents, item.mChangedTile, NavMeshKeyRef(item.mNavMeshKey)));
|
||||||
if (agentValues == mValues.end())
|
if (value == 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())
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
mUsedNavMeshDataSize -= item.mSize;
|
mUsedNavMeshDataSize -= item.mSize;
|
||||||
mFreeNavMeshDataSize -= item.mSize;
|
mFreeNavMeshDataSize -= item.mSize;
|
||||||
|
|
||||||
tileValues->second.mMap.erase(value);
|
mValues.erase(value);
|
||||||
mFreeItems.pop_back();
|
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)
|
void NavMeshTilesCache::acquireItemUnsafe(ItemIterator iterator)
|
||||||
|
@ -110,6 +110,14 @@ namespace DetourNavigator
|
|||||||
return lhs < rhs.mRef.get();
|
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
|
class NavMeshTilesCache
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -211,11 +219,6 @@ namespace DetourNavigator
|
|||||||
void reportStats(unsigned int frameNumber, osg::Stats& stats) const;
|
void reportStats(unsigned int frameNumber, osg::Stats& stats) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct TileMap
|
|
||||||
{
|
|
||||||
std::map<NavMeshKeyRef, ItemIterator, std::less<>> mMap;
|
|
||||||
};
|
|
||||||
|
|
||||||
mutable std::mutex mMutex;
|
mutable std::mutex mMutex;
|
||||||
std::size_t mMaxNavMeshDataSize;
|
std::size_t mMaxNavMeshDataSize;
|
||||||
std::size_t mUsedNavMeshDataSize;
|
std::size_t mUsedNavMeshDataSize;
|
||||||
@ -224,7 +227,7 @@ namespace DetourNavigator
|
|||||||
std::size_t mGetCount;
|
std::size_t mGetCount;
|
||||||
std::list<Item> mBusyItems;
|
std::list<Item> mBusyItems;
|
||||||
std::list<Item> mFreeItems;
|
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();
|
void removeLeastRecentlyUsed();
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user