mirror of
https://github.com/OpenMW/openmw.git
synced 2025-03-03 17:39:42 +00:00
Do not cache navmesh when only object transformation is changed
This saves cache capacity when a scene contains objects contantly transforming by scripts and causing changes in navmesh. The probability to get cache hit for such states is almost zero because even a constant change in a single float value may give up to 2^32 different states.
This commit is contained in:
parent
3cbe93358a
commit
86e6d3dac8
3 changed files with 22 additions and 3 deletions
|
@ -18,6 +18,8 @@ namespace
|
||||||
{
|
{
|
||||||
using DetourNavigator::ChangeType;
|
using DetourNavigator::ChangeType;
|
||||||
using DetourNavigator::TilePosition;
|
using DetourNavigator::TilePosition;
|
||||||
|
using DetourNavigator::UpdateType;
|
||||||
|
using DetourNavigator::ChangeType;
|
||||||
|
|
||||||
int getManhattanDistance(const TilePosition& lhs, const TilePosition& rhs)
|
int getManhattanDistance(const TilePosition& lhs, const TilePosition& rhs)
|
||||||
{
|
{
|
||||||
|
@ -35,6 +37,13 @@ namespace
|
||||||
result = std::min(result, getManhattanDistance(position, tile));
|
result = std::min(result, getManhattanDistance(position, tile));
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
UpdateType getUpdateType(ChangeType changeType) noexcept
|
||||||
|
{
|
||||||
|
if (changeType == ChangeType::update)
|
||||||
|
return UpdateType::Temporary;
|
||||||
|
return UpdateType::Persistent;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace DetourNavigator
|
namespace DetourNavigator
|
||||||
|
@ -282,7 +291,7 @@ namespace DetourNavigator
|
||||||
const auto offMeshConnections = mOffMeshConnectionsManager.get().get(job.mChangedTile);
|
const auto offMeshConnections = mOffMeshConnectionsManager.get().get(job.mChangedTile);
|
||||||
|
|
||||||
const auto status = updateNavMesh(job.mAgentHalfExtents, recastMesh.get(), job.mChangedTile, playerTile,
|
const auto status = updateNavMesh(job.mAgentHalfExtents, recastMesh.get(), job.mChangedTile, playerTile,
|
||||||
offMeshConnections, mSettings, navMeshCacheItem, mNavMeshTilesCache);
|
offMeshConnections, mSettings, navMeshCacheItem, mNavMeshTilesCache, getUpdateType(job.mChangeType));
|
||||||
|
|
||||||
if (recastMesh != nullptr)
|
if (recastMesh != nullptr)
|
||||||
{
|
{
|
||||||
|
|
|
@ -506,7 +506,7 @@ namespace DetourNavigator
|
||||||
UpdateNavMeshStatus updateNavMesh(const osg::Vec3f& agentHalfExtents, const RecastMesh* recastMesh,
|
UpdateNavMeshStatus updateNavMesh(const osg::Vec3f& agentHalfExtents, const RecastMesh* recastMesh,
|
||||||
const TilePosition& changedTile, const TilePosition& playerTile,
|
const TilePosition& changedTile, const TilePosition& playerTile,
|
||||||
const std::vector<OffMeshConnection>& offMeshConnections, const Settings& settings,
|
const std::vector<OffMeshConnection>& offMeshConnections, const Settings& settings,
|
||||||
const SharedNavMeshCacheItem& navMeshCacheItem, NavMeshTilesCache& navMeshTilesCache)
|
const SharedNavMeshCacheItem& navMeshCacheItem, NavMeshTilesCache& navMeshTilesCache, UpdateType updateType)
|
||||||
{
|
{
|
||||||
Log(Debug::Debug) << std::fixed << std::setprecision(2) <<
|
Log(Debug::Debug) << std::fixed << std::setprecision(2) <<
|
||||||
"Update NavMesh with multiple tiles:" <<
|
"Update NavMesh with multiple tiles:" <<
|
||||||
|
@ -562,6 +562,10 @@ namespace DetourNavigator
|
||||||
return navMeshCacheItem->lock()->removeTile(changedTile);
|
return navMeshCacheItem->lock()->removeTile(changedTile);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (updateType == UpdateType::Temporary)
|
||||||
|
return navMeshCacheItem->lock()->updateTile(changedTile, NavMeshTilesCache::Value(),
|
||||||
|
makeNavMeshTileData(*prepared, offMeshConnections, agentHalfExtents, changedTile, settings));
|
||||||
|
|
||||||
cachedNavMeshData = navMeshTilesCache.set(agentHalfExtents, changedTile, *recastMesh, std::move(prepared));
|
cachedNavMeshData = navMeshTilesCache.set(agentHalfExtents, changedTile, *recastMesh, std::move(prepared));
|
||||||
|
|
||||||
if (!cachedNavMeshData)
|
if (!cachedNavMeshData)
|
||||||
|
|
|
@ -47,10 +47,16 @@ namespace DetourNavigator
|
||||||
|
|
||||||
NavMeshPtr makeEmptyNavMesh(const Settings& settings);
|
NavMeshPtr makeEmptyNavMesh(const Settings& settings);
|
||||||
|
|
||||||
|
enum class UpdateType
|
||||||
|
{
|
||||||
|
Persistent,
|
||||||
|
Temporary
|
||||||
|
};
|
||||||
|
|
||||||
UpdateNavMeshStatus updateNavMesh(const osg::Vec3f& agentHalfExtents, const RecastMesh* recastMesh,
|
UpdateNavMeshStatus updateNavMesh(const osg::Vec3f& agentHalfExtents, const RecastMesh* recastMesh,
|
||||||
const TilePosition& changedTile, const TilePosition& playerTile,
|
const TilePosition& changedTile, const TilePosition& playerTile,
|
||||||
const std::vector<OffMeshConnection>& offMeshConnections, const Settings& settings,
|
const std::vector<OffMeshConnection>& offMeshConnections, const Settings& settings,
|
||||||
const SharedNavMeshCacheItem& navMeshCacheItem, NavMeshTilesCache& navMeshTilesCache);
|
const SharedNavMeshCacheItem& navMeshCacheItem, NavMeshTilesCache& navMeshTilesCache, UpdateType updateType);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue