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>
private readonly UnsafeArray<EcsMaskChunck> _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)
{
case MaskType.Empty:
group.CopyFrom(source);
break;
case MaskType.OnlyInc:
IterateOnlyInc(source).CopyTo(group);
}
else
{
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)
{
case MaskType.Empty:
return source.ToArray(ref array);
case MaskType.OnlyInc:
return IterateOnlyInc(source).CopyTo(ref array);
}
else
{
case MaskType.IncExc:
return Iterate(source).CopyTo(ref array);
default:
Throw.UndefinedException();
return 0;
}
}
#endregion

View File

@ -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

View File

@ -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();
}

View File

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

View File

@ -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<T>.Size * newCount))).ToPointer();
}
}
public static class CollectionUtility