update ecsgroup

This commit is contained in:
Mikhail 2024-09-04 12:11:35 +08:00
parent cbfb54b32e
commit 161c1cb7bd

View File

@ -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]; }