From 4759f186ad35c9ec1c5834ebbdc416f5caa1e2c4 Mon Sep 17 00:00:00 2001
From: DCFApixels <99481254+DCFApixels@users.noreply.github.com>
Date: Sun, 17 Nov 2024 21:43:50 +0800
Subject: [PATCH] update queries & mask iterator
---
src/EcsMask.cs | 52 +++++++++++++++++-------
src/Executors/EcsWhereExecutor.cs | 4 ++
src/Executors/EcsWhereToGroupExecutor.cs | 4 ++
src/Executors/MaskQueryExecutor.cs | 2 +-
src/Internal/ArrayUtility.cs | 6 ++-
5 files changed, 51 insertions(+), 17 deletions(-)
diff --git a/src/EcsMask.cs b/src/EcsMask.cs
index cb43005..1c72299 100644
--- a/src/EcsMask.cs
+++ b/src/EcsMask.cs
@@ -497,7 +497,13 @@ namespace DCFApixels.DragonECS
/// slised _sortIncChunckBuffer
private readonly UnsafeArray _sortExcChunckBuffer;
- private readonly bool _isOnlyInc;
+ private readonly MaskType _maskType;
+ private enum MaskType : byte
+ {
+ Empty,
+ OnlyInc,
+ IncExc,
+ }
#region Constructors/Finalizator
public unsafe EcsMaskIterator(EcsWorld source, EcsMask mask)
@@ -523,7 +529,14 @@ namespace DCFApixels.DragonECS
_sortExcChunckBuffer = sortChunckBuffer.Slice(mask._incChunckMasks.Length, mask._excChunckMasks.Length);
_sortExcChunckBuffer.CopyFromArray_Unchecked(mask._excChunckMasks);
- _isOnlyInc = _sortExcBuffer.Length <= 0;
+ if (_sortExcBuffer.Length <= 0)
+ {
+ _maskType = mask.IsEmpty ? MaskType.Empty : MaskType.OnlyInc;
+ }
+ else
+ {
+ _maskType = MaskType.IncExc;
+ }
}
unsafe ~EcsMaskIterator()
{
@@ -589,25 +602,36 @@ namespace DCFApixels.DragonECS
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void IterateTo(EcsSpan source, EcsGroup group)
{
- if (_isOnlyInc)
+ switch (_maskType)
{
- IterateOnlyInc(source).CopyTo(group);
- }
- else
- {
- Iterate(source).CopyTo(group);
+ case MaskType.Empty:
+ group.CopyFrom(source);
+ break;
+ case MaskType.OnlyInc:
+ IterateOnlyInc(source).CopyTo(group);
+ break;
+ case MaskType.IncExc:
+ Iterate(source).CopyTo(group);
+ break;
+ default:
+ Throw.UndefinedException();
+ break;
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public int IterateTo(EcsSpan source, ref int[] array)
{
- if (_isOnlyInc)
+ switch (_maskType)
{
- return IterateOnlyInc(source).CopyTo(ref array);
- }
- else
- {
- return Iterate(source).CopyTo(ref array);
+ case MaskType.Empty:
+ return source.ToArray(ref array);
+ case MaskType.OnlyInc:
+ return IterateOnlyInc(source).CopyTo(ref array);
+ case MaskType.IncExc:
+ return Iterate(source).CopyTo(ref array);
+ default:
+ Throw.UndefinedException();
+ return 0;
}
}
#endregion
diff --git a/src/Executors/EcsWhereExecutor.cs b/src/Executors/EcsWhereExecutor.cs
index 936abc4..bc9bc50 100644
--- a/src/Executors/EcsWhereExecutor.cs
+++ b/src/Executors/EcsWhereExecutor.cs
@@ -23,6 +23,8 @@ namespace DCFApixels.DragonECS.Internal
private long _version;
private WorldStateVersionsChecker _versionsChecker;
+ public bool _isDestroyed = false;
+
#region Properties
public sealed override long Version
{
@@ -49,6 +51,8 @@ namespace DCFApixels.DragonECS.Internal
}
protected sealed override void OnDestroy()
{
+ if (_isDestroyed) { return; }
+ _isDestroyed = true;
_versionsChecker.Dispose();
}
#endregion
diff --git a/src/Executors/EcsWhereToGroupExecutor.cs b/src/Executors/EcsWhereToGroupExecutor.cs
index 7f626e0..8511206 100644
--- a/src/Executors/EcsWhereToGroupExecutor.cs
+++ b/src/Executors/EcsWhereToGroupExecutor.cs
@@ -20,6 +20,8 @@ namespace DCFApixels.DragonECS.Internal
private long _version;
private WorldStateVersionsChecker _versionsChecker;
+ public bool _isDestroyed = false;
+
#region Properties
public sealed override long Version
{
@@ -47,6 +49,8 @@ namespace DCFApixels.DragonECS.Internal
}
protected sealed override void OnDestroy()
{
+ if (_isDestroyed) { return; }
+ _isDestroyed = true;
_filteredAllGroup.Dispose();
_versionsChecker.Dispose();
}
diff --git a/src/Executors/MaskQueryExecutor.cs b/src/Executors/MaskQueryExecutor.cs
index be20d3f..d6f70f2 100644
--- a/src/Executors/MaskQueryExecutor.cs
+++ b/src/Executors/MaskQueryExecutor.cs
@@ -200,7 +200,7 @@ namespace DCFApixels.DragonECS.Core
public void Dispose()
{
-
+ UnmanagedArrayUtility.Free(_versions);
}
}
}
\ No newline at end of file
diff --git a/src/Internal/ArrayUtility.cs b/src/Internal/ArrayUtility.cs
index 51d04a3..43aac30 100644
--- a/src/Internal/ArrayUtility.cs
+++ b/src/Internal/ArrayUtility.cs
@@ -203,7 +203,9 @@ namespace DCFApixels.DragonECS.Internal
byte* newPointer = (byte*)Marshal.AllocHGlobal(newSize).ToPointer();
for (int i = 0; i < newSize; i++)
+ {
*(newPointer + i) = 0;
+ }
return (T*)newPointer;
}
@@ -214,7 +216,9 @@ namespace DCFApixels.DragonECS.Internal
byte* newPointer = (byte*)Marshal.AllocHGlobal(newSize).ToPointer();
for (int i = 0; i < newSize; i++)
+ {
*(newPointer + i) = 0;
+ }
ptr = (T*)newPointer;
}
@@ -250,8 +254,6 @@ namespace DCFApixels.DragonECS.Internal
new IntPtr(oldPointer),
new IntPtr(MetaCache.Size * newCount))).ToPointer();
}
-
-
}
public static class CollectionUtility