Changed data structure of 'neis' from List<byte> to byte[] for optimized memory usage and improved access speed in `DtLayerMonotoneRegion`

This commit is contained in:
ikpil 2024-07-12 23:55:35 +09:00
parent 00950b1210
commit 990dbcf97f
7 changed files with 28 additions and 16 deletions

View File

@ -13,7 +13,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Nothing
### Changed
- Nothing
- Changed data structure of 'neis' from List<byte> to byte[] for optimized memory usage and improved access speed in `DtLayerMonotoneRegion`
### Removed
- Nothing

View File

@ -136,6 +136,14 @@ namespace DotRecast.Core.Numerics
@out[n + 2] = @in[m + 2];
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void Copy(Span<float> @out, int n, Span<float> @in, int m)
{
@out[n + 0] = @in[m + 0];
@out[n + 1] = @in[m + 1];
@out[n + 2] = @in[m + 2];
}
/// Returns the distance between two points.
/// @param[in] v1 A point. [(x, y, z)]
/// @param[in] v2 A point. [(x, y, z)]

View File

@ -7,7 +7,8 @@ namespace DotRecast.Detour.TileCache
public const int DT_LAYER_MAX_NEIS = 16;
public int area;
public List<byte> neis = new List<byte>(DT_LAYER_MAX_NEIS);
public byte[] neis = new byte[DT_LAYER_MAX_NEIS];
public byte nneis;
public byte regId;
public byte areaId;
};

View File

@ -181,8 +181,8 @@ namespace DotRecast.Detour.TileCache
byte rai = layer.regs[ymi];
if (rai != 0xff && rai != ri)
{
AddUniqueLast(regs[ri].neis, rai);
AddUniqueLast(regs[rai].neis, ri);
AddUniqueLast(regs[ri].neis, ref regs[ri].nneis, rai);
AddUniqueLast(regs[rai].neis, ref regs[rai].nneis, ri);
}
}
}
@ -197,8 +197,9 @@ namespace DotRecast.Detour.TileCache
int merge = -1;
int mergea = 0;
foreach (int nei in reg.neis)
for (int j = 0; j < reg.nneis; ++j)
{
byte nei = reg.neis[j];
DtLayerMonotoneRegion regn = regs[nei];
if (reg.regId == regn.regId)
continue;
@ -246,12 +247,13 @@ namespace DotRecast.Detour.TileCache
}
}
public static void AddUniqueLast(List<byte> a, byte v)
public static void AddUniqueLast(byte[] a, ref byte an, byte v)
{
int n = a.Count;
int n = an;
if (n > 0 && a[n - 1] == v)
return;
a.Add(v);
a[an] = v;
an++;
}
public static bool IsConnected(DtTileCacheLayer layer, int ia, int ib, int walkableClimb)
@ -271,9 +273,11 @@ namespace DotRecast.Detour.TileCache
DtLayerMonotoneRegion reg = regs[i];
if (reg.regId != oldRegId)
continue;
foreach (int nei in reg.neis)
int nnei = reg.nneis;
for (int j = 0; j < nnei ; ++j)
{
if (regs[nei].regId == newRegId)
if (regs[reg.neis[j]].regId == newRegId)
count++;
}
}

View File

@ -32,7 +32,6 @@ namespace DotRecast.Recast
const int RC_MAX_LAYERS = RcRecast.RC_NOT_CONNECTED;
const int RC_MAX_NEIS = 16;
private static void AddUnique(List<int> a, int v)
{
if (!a.Contains(v))

View File

@ -209,7 +209,7 @@ namespace DotRecast.Recast
/// @param[out] outVerts2Count The number of resulting polygon 2 vertices
/// @param[in] axisOffset THe offset along the specified axis
/// @param[in] axis The separating axis
private static void DividePoly(float[] inVerts, int inVertsOffset, int inVertsCount,
private static void DividePoly(Span<float> inVerts, int inVertsOffset, int inVertsCount,
int outVerts1, out int outVerts1Count,
int outVerts2, out int outVerts2Count,
float axisOffset, int axis)
@ -322,7 +322,7 @@ namespace DotRecast.Recast
z1 = Math.Clamp(z1, 0, h - 1);
// Clip the triangle into all grid cells it touches.
float[] buf = new float[7 * 3 * 4];
Span<float> buf = stackalloc float[7 * 3 * 4];
int @in = 0;
int inRow = 7 * 3;
int p1 = inRow + 7 * 3;

View File

@ -1665,8 +1665,8 @@ namespace DotRecast.Recast
ctx.StartTimer(RcTimerLabel.RC_TIMER_BUILD_REGIONS_WATERSHED);
int LOG_NB_STACKS = 3;
int NB_STACKS = 1 << LOG_NB_STACKS;
const int LOG_NB_STACKS = 3;
const int NB_STACKS = 1 << LOG_NB_STACKS;
List<List<RcLevelStackEntry>> lvlStacks = new List<List<RcLevelStackEntry>>();
for (int i = 0; i < NB_STACKS; ++i)
{