mirror of
https://github.com/DCFApixels/DragonECS.git
synced 2025-09-18 18:14:37 +08:00
update queries & mask iterator
This commit is contained in:
parent
f228ca50d2
commit
4759f186ad
@ -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)
|
||||||
{
|
{
|
||||||
IterateOnlyInc(source).CopyTo(group);
|
case MaskType.Empty:
|
||||||
}
|
group.CopyFrom(source);
|
||||||
else
|
break;
|
||||||
{
|
case MaskType.OnlyInc:
|
||||||
Iterate(source).CopyTo(group);
|
IterateOnlyInc(source).CopyTo(group);
|
||||||
|
break;
|
||||||
|
case MaskType.IncExc:
|
||||||
|
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)
|
||||||
{
|
{
|
||||||
return IterateOnlyInc(source).CopyTo(ref array);
|
case MaskType.Empty:
|
||||||
}
|
return source.ToArray(ref array);
|
||||||
else
|
case MaskType.OnlyInc:
|
||||||
{
|
return IterateOnlyInc(source).CopyTo(ref array);
|
||||||
return Iterate(source).CopyTo(ref array);
|
case MaskType.IncExc:
|
||||||
|
return Iterate(source).CopyTo(ref array);
|
||||||
|
default:
|
||||||
|
Throw.UndefinedException();
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
@ -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
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -200,7 +200,7 @@ namespace DCFApixels.DragonECS.Core
|
|||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
|
UnmanagedArrayUtility.Free(_versions);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user