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