update queries & mask iterator

This commit is contained in:
DCFApixels 2024-11-17 21:43:50 +08:00
parent f228ca50d2
commit 4759f186ad
5 changed files with 51 additions and 17 deletions

View File

@ -497,7 +497,13 @@ namespace DCFApixels.DragonECS
/// <summary> slised _sortIncChunckBuffer </summary> /// <summary> slised _sortIncChunckBuffer </summary>
private readonly UnsafeArray<EcsMaskChunck> _sortExcChunckBuffer; private readonly UnsafeArray<EcsMaskChunck> _sortExcChunckBuffer;
private readonly bool _isOnlyInc; private readonly MaskType _maskType;
private enum MaskType : byte
{
Empty,
OnlyInc,
IncExc,
}
#region Constructors/Finalizator #region Constructors/Finalizator
public unsafe EcsMaskIterator(EcsWorld source, EcsMask mask) public unsafe EcsMaskIterator(EcsWorld source, EcsMask mask)
@ -523,7 +529,14 @@ namespace DCFApixels.DragonECS
_sortExcChunckBuffer = sortChunckBuffer.Slice(mask._incChunckMasks.Length, mask._excChunckMasks.Length); _sortExcChunckBuffer = sortChunckBuffer.Slice(mask._incChunckMasks.Length, mask._excChunckMasks.Length);
_sortExcChunckBuffer.CopyFromArray_Unchecked(mask._excChunckMasks); _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() unsafe ~EcsMaskIterator()
{ {
@ -589,25 +602,36 @@ namespace DCFApixels.DragonECS
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public void IterateTo(EcsSpan source, EcsGroup group) public void IterateTo(EcsSpan source, EcsGroup group)
{ {
if (_isOnlyInc) switch (_maskType)
{ {
case MaskType.Empty:
group.CopyFrom(source);
break;
case MaskType.OnlyInc:
IterateOnlyInc(source).CopyTo(group); IterateOnlyInc(source).CopyTo(group);
} break;
else case MaskType.IncExc:
{
Iterate(source).CopyTo(group); Iterate(source).CopyTo(group);
break;
default:
Throw.UndefinedException();
break;
} }
} }
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public int IterateTo(EcsSpan source, ref int[] array) public int IterateTo(EcsSpan source, ref int[] array)
{ {
if (_isOnlyInc) switch (_maskType)
{ {
case MaskType.Empty:
return source.ToArray(ref array);
case MaskType.OnlyInc:
return IterateOnlyInc(source).CopyTo(ref array); return IterateOnlyInc(source).CopyTo(ref array);
} case MaskType.IncExc:
else
{
return Iterate(source).CopyTo(ref array); return Iterate(source).CopyTo(ref array);
default:
Throw.UndefinedException();
return 0;
} }
} }
#endregion #endregion

View File

@ -23,6 +23,8 @@ namespace DCFApixels.DragonECS.Internal
private long _version; private long _version;
private WorldStateVersionsChecker _versionsChecker; private WorldStateVersionsChecker _versionsChecker;
public bool _isDestroyed = false;
#region Properties #region Properties
public sealed override long Version public sealed override long Version
{ {
@ -49,6 +51,8 @@ namespace DCFApixels.DragonECS.Internal
} }
protected sealed override void OnDestroy() protected sealed override void OnDestroy()
{ {
if (_isDestroyed) { return; }
_isDestroyed = true;
_versionsChecker.Dispose(); _versionsChecker.Dispose();
} }
#endregion #endregion

View File

@ -20,6 +20,8 @@ namespace DCFApixels.DragonECS.Internal
private long _version; private long _version;
private WorldStateVersionsChecker _versionsChecker; private WorldStateVersionsChecker _versionsChecker;
public bool _isDestroyed = false;
#region Properties #region Properties
public sealed override long Version public sealed override long Version
{ {
@ -47,6 +49,8 @@ namespace DCFApixels.DragonECS.Internal
} }
protected sealed override void OnDestroy() protected sealed override void OnDestroy()
{ {
if (_isDestroyed) { return; }
_isDestroyed = true;
_filteredAllGroup.Dispose(); _filteredAllGroup.Dispose();
_versionsChecker.Dispose(); _versionsChecker.Dispose();
} }

View File

@ -200,7 +200,7 @@ namespace DCFApixels.DragonECS.Core
public void Dispose() public void Dispose()
{ {
UnmanagedArrayUtility.Free(_versions);
} }
} }
} }

View File

@ -203,7 +203,9 @@ namespace DCFApixels.DragonECS.Internal
byte* newPointer = (byte*)Marshal.AllocHGlobal(newSize).ToPointer(); byte* newPointer = (byte*)Marshal.AllocHGlobal(newSize).ToPointer();
for (int i = 0; i < newSize; i++) for (int i = 0; i < newSize; i++)
{
*(newPointer + i) = 0; *(newPointer + i) = 0;
}
return (T*)newPointer; return (T*)newPointer;
} }
@ -214,7 +216,9 @@ namespace DCFApixels.DragonECS.Internal
byte* newPointer = (byte*)Marshal.AllocHGlobal(newSize).ToPointer(); byte* newPointer = (byte*)Marshal.AllocHGlobal(newSize).ToPointer();
for (int i = 0; i < newSize; i++) for (int i = 0; i < newSize; i++)
{
*(newPointer + i) = 0; *(newPointer + i) = 0;
}
ptr = (T*)newPointer; ptr = (T*)newPointer;
} }
@ -250,8 +254,6 @@ namespace DCFApixels.DragonECS.Internal
new IntPtr(oldPointer), new IntPtr(oldPointer),
new IntPtr(MetaCache<T>.Size * newCount))).ToPointer(); new IntPtr(MetaCache<T>.Size * newCount))).ToPointer();
} }
} }
public static class CollectionUtility public static class CollectionUtility