Optimize NavMesh to not allocate tile memory twice and add safelock to asset data

This commit is contained in:
Wojtek Figat
2025-04-03 17:21:48 +02:00
parent a29b556de6
commit 0c6f1ff9dc
5 changed files with 13 additions and 8 deletions

View File

@@ -70,9 +70,8 @@ Asset::LoadResult RawDataAsset::load()
if (chunk0 == nullptr || chunk0->IsMissing())
return LoadResult::MissingDataChunk;
Data.Clear();
Data.EnsureCapacity(chunk0->Data.Length());
Data.Add(chunk0->Data.Get(), chunk0->Data.Length());
// TODO: swap memory alloc pointer to optimize this asset
Data.Set(chunk0->Data.Get(), chunk0->Data.Length());
return LoadResult::Ok;
}

View File

@@ -104,6 +104,7 @@ void NavMesh::OnDataAssetLoaded()
// Skip if already has data (prevent reloading navmesh on saving)
if (Data.Tiles.HasItems())
return;
ScopeLock lock(DataAsset->Locker);
// Remove added tiles
if (_navMeshActive)

View File

@@ -80,7 +80,7 @@ bool NavMeshData::Load(BytesContainer& data, bool copyData)
tile.Layer = tileHeader->Layer;
// Read tile data
const auto tileData = stream.Move<byte>(tileHeader->DataSize);
const auto* tileData = (const byte*)stream.Move(tileHeader->DataSize);
if (copyData)
tile.Data.Copy(tileData, tileHeader->DataSize);
else

View File

@@ -7,13 +7,13 @@
class WriteStream;
struct NavMeshTileDataHeader
PACK_STRUCT(struct NavMeshTileDataHeader
{
int32 PosX;
int32 PosY;
int32 Layer;
int32 DataSize;
};
});
struct NavMeshTileData
{

View File

@@ -13,8 +13,7 @@
#define MAX_NODES 2048
#define USE_DATA_LINK 0
#define USE_NAV_MESH_ALLOC 1
// TODO: try not using USE_NAV_MESH_ALLOC
#define USE_NAV_MESH_ALLOC 0
namespace
{
@@ -367,6 +366,9 @@ void NavMeshRuntime::EnsureCapacity(int32 tilesToAddCount)
if (dtStatusFailed(result))
{
LOG(Warning, "Could not add tile ({2}x{3}, layer {4}) to navmesh {0} (error: {1})", Properties.Name, result & ~DT_FAILURE, tile.X, tile.Y, tile.Layer);
#if USE_NAV_MESH_ALLOC
dtFree(data);
#endif
}
}
}
@@ -672,5 +674,8 @@ void NavMeshRuntime::AddTileInternal(NavMesh* navMesh, NavMeshTileData& tileData
if (dtStatusFailed(result))
{
LOG(Warning, "Could not add tile ({2}x{3}, layer {4}) to navmesh {0} (error: {1})", Properties.Name, result & ~DT_FAILURE, tileData.PosX, tileData.PosY, tileData.Layer);
#if USE_NAV_MESH_ALLOC
dtFree(data);
#endif
}
}