mirror of
https://github.com/DCFApixels/DragonECS.git
synced 2025-11-13 00:55: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.CompilerServices;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
//_dense заполняется с индекса 1
|
||||||
|
//в операциях изменяющих состояние группы нельзя итерироваться по this, либо осторожно учитывать этот момент
|
||||||
namespace DCFApixels.DragonECS
|
namespace DCFApixels.DragonECS
|
||||||
{
|
{
|
||||||
#if ENABLE_IL2CPP
|
#if ENABLE_IL2CPP
|
||||||
@ -15,8 +17,6 @@ namespace DCFApixels.DragonECS
|
|||||||
[Il2CppSetOption(Option.NullChecks, false)]
|
[Il2CppSetOption(Option.NullChecks, false)]
|
||||||
[Il2CppSetOption(Option.ArrayBoundsChecks, false)]
|
[Il2CppSetOption(Option.ArrayBoundsChecks, false)]
|
||||||
#endif
|
#endif
|
||||||
//_dense заполняется с индекса 1
|
|
||||||
//в операциях изменяющих состояние группы нельзя итерироваться по this, либо осторожно учитывать этот момент
|
|
||||||
[StructLayout(LayoutKind.Sequential, Pack = 0, Size = 8)]
|
[StructLayout(LayoutKind.Sequential, Pack = 0, Size = 8)]
|
||||||
[DebuggerTypeProxy(typeof(EcsGroup.DebuggerProxy))]
|
[DebuggerTypeProxy(typeof(EcsGroup.DebuggerProxy))]
|
||||||
public readonly ref struct EcsReadonlyGroup
|
public readonly ref struct EcsReadonlyGroup
|
||||||
@ -277,53 +277,6 @@ namespace DCFApixels.DragonECS
|
|||||||
}
|
}
|
||||||
#endregion
|
#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
|
#region Add/Remove
|
||||||
public void AddUnchecked(int entityID)
|
public void AddUnchecked(int entityID)
|
||||||
{
|
{
|
||||||
@ -638,7 +591,7 @@ namespace DCFApixels.DragonECS
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
foreach (var entityID in other)
|
foreach (var entityID in other)
|
||||||
{
|
{
|
||||||
@ -1289,6 +1242,53 @@ namespace DCFApixels.DragonECS
|
|||||||
}
|
}
|
||||||
#endregion
|
#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
|
#region Other
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||||
public int First() { return _dense[1]; }
|
public int First() { return _dense[1]; }
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user