mirror of
https://github.com/DCFApixels/DragonECS.git
synced 2025-11-12 16:45:55 +08:00
update ecsgroup
This commit is contained in:
parent
cbfb54b32e
commit
161c1cb7bd
@ -8,6 +8,8 @@ using System.Linq;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
//_dense заполняется с индекса 1
|
||||
//в операциях изменяющих состояние группы нельзя итерироваться по this, либо осторожно учитывать этот момент
|
||||
namespace DCFApixels.DragonECS
|
||||
{
|
||||
#if ENABLE_IL2CPP
|
||||
@ -15,8 +17,6 @@ namespace DCFApixels.DragonECS
|
||||
[Il2CppSetOption(Option.NullChecks, false)]
|
||||
[Il2CppSetOption(Option.ArrayBoundsChecks, false)]
|
||||
#endif
|
||||
//_dense заполняется с индекса 1
|
||||
//в операциях изменяющих состояние группы нельзя итерироваться по this, либо осторожно учитывать этот момент
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 0, Size = 8)]
|
||||
[DebuggerTypeProxy(typeof(EcsGroup.DebuggerProxy))]
|
||||
public readonly ref struct EcsReadonlyGroup
|
||||
@ -277,53 +277,6 @@ namespace DCFApixels.DragonECS
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region HiBitMarking
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private void Mark_Internal(int entityID)
|
||||
{
|
||||
_sparse[entityID] |= int.MinValue;
|
||||
}
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private bool IsMark_Internal(int entityID)
|
||||
{
|
||||
return (_sparse[entityID] & int.MinValue) == int.MinValue;
|
||||
}
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private void Unmark_Internal(int entityID)
|
||||
{
|
||||
_sparse[entityID] &= int.MaxValue;
|
||||
}
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private void ClearUnmarked_Internal()
|
||||
{
|
||||
for (int i = _count; i > 0; i--)//итерация в обратном порядке исключает ошибки при удалении элементов
|
||||
{
|
||||
int entityID = _dense[i];
|
||||
if (IsMark_Internal(entityID))
|
||||
{
|
||||
Unmark_Internal(entityID);
|
||||
}
|
||||
else
|
||||
{
|
||||
Remove_Internal(entityID);
|
||||
}
|
||||
}
|
||||
}
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private void ClearMarked_Internal()
|
||||
{
|
||||
for (int i = _count; i > 0; i--)//итерация в обратном порядке исключает ошибки при удалении элементов
|
||||
{
|
||||
int entityID = _dense[i];
|
||||
if (IsMark_Internal(entityID))
|
||||
{
|
||||
Unmark_Internal(entityID); // Unmark_Internal должен быть до Remove_Internal
|
||||
Remove_Internal(entityID);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Add/Remove
|
||||
public void AddUnchecked(int entityID)
|
||||
{
|
||||
@ -638,7 +591,7 @@ namespace DCFApixels.DragonECS
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
else
|
||||
{
|
||||
foreach (var entityID in other)
|
||||
{
|
||||
@ -1289,6 +1242,53 @@ namespace DCFApixels.DragonECS
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region HiBitMarking
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private void Mark_Internal(int entityID)
|
||||
{
|
||||
_sparse[entityID] |= int.MinValue;
|
||||
}
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private bool IsMark_Internal(int entityID)
|
||||
{
|
||||
return (_sparse[entityID] & int.MinValue) == int.MinValue;
|
||||
}
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private void Unmark_Internal(int entityID)
|
||||
{
|
||||
_sparse[entityID] &= int.MaxValue;
|
||||
}
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private void ClearUnmarked_Internal()
|
||||
{
|
||||
for (int i = _count; i > 0; i--)//итерация в обратном порядке исключает ошибки при удалении элементов
|
||||
{
|
||||
int entityID = _dense[i];
|
||||
if (IsMark_Internal(entityID))
|
||||
{
|
||||
Unmark_Internal(entityID);
|
||||
}
|
||||
else
|
||||
{
|
||||
Remove_Internal(entityID);
|
||||
}
|
||||
}
|
||||
}
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private void ClearMarked_Internal()
|
||||
{
|
||||
for (int i = _count; i > 0; i--)//итерация в обратном порядке исключает ошибки при удалении элементов
|
||||
{
|
||||
int entityID = _dense[i];
|
||||
if (IsMark_Internal(entityID))
|
||||
{
|
||||
Unmark_Internal(entityID); // Unmark_Internal должен быть до Remove_Internal
|
||||
Remove_Internal(entityID);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Other
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public int First() { return _dense[1]; }
|
||||
|
||||
Loading…
Reference in New Issue
Block a user