mirror of
https://github.com/DCFApixels/DragonECS.git
synced 2025-09-17 09:24:37 +08:00
update
This commit is contained in:
parent
54f25eaaad
commit
71bf7064e1
@ -230,7 +230,7 @@ namespace DCFApixels.DragonECS
|
||||
ref var page = ref _groupSparsePagePool[i];
|
||||
if (page.IsEmpty == false)
|
||||
{
|
||||
MemoryAllocator.Free(ref page);
|
||||
MemoryAllocator.FreeAndClear(ref page);
|
||||
}
|
||||
}
|
||||
_groupSparsePagePoolCount = 0;
|
||||
|
@ -6,6 +6,10 @@ using DCFApixels.DragonECS.Core.Internal;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
#if ENABLE_IL2CPP
|
||||
using Unity.IL2CPP.CompilerServices;
|
||||
#endif
|
||||
|
||||
namespace DCFApixels.DragonECS
|
||||
{
|
||||
@ -105,16 +109,22 @@ namespace DCFApixels.DragonECS.Core
|
||||
|
||||
|
||||
//TODO добавить Any
|
||||
#if ENABLE_IL2CPP
|
||||
[Il2CppSetOption(Option.NullChecks, false)]
|
||||
[Il2CppSetOption(Option.ArrayBoundsChecks, false)]
|
||||
#endif
|
||||
public readonly unsafe struct WorldStateVersionsChecker : IDisposable
|
||||
{
|
||||
private readonly EcsWorld _world;
|
||||
private readonly int[] _maskInc;
|
||||
private readonly int[] _maskExc;
|
||||
// [0] world version
|
||||
// [-> _maskInc.Length] inc versions
|
||||
// [-> _maskExc.Length] exc versions
|
||||
private readonly MemoryAllocator.Handler _handler;
|
||||
private readonly int* _componentIDs;
|
||||
// _versions[0] world version
|
||||
// _versions[-> EcsMask.Inc.Length] inc versions
|
||||
// _versions[-> EcsMask.Exc.Length] exc versions
|
||||
// _versions[-> EcsMask.Any.Length] any versions
|
||||
private readonly long* _versions;
|
||||
private readonly int _count;
|
||||
private readonly bool _isNotOnlyExc;
|
||||
public long Version
|
||||
{
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
@ -124,11 +134,20 @@ namespace DCFApixels.DragonECS.Core
|
||||
public WorldStateVersionsChecker(EcsMask mask)
|
||||
{
|
||||
_world = mask.World;
|
||||
_maskInc = mask._incs;
|
||||
_maskExc = mask._excs;
|
||||
_count = 1 + mask._incs.Length + mask._excs.Length;
|
||||
_count = 1 + mask._incs.Length + mask._excs.Length + mask._anys.Length;
|
||||
|
||||
_versions = UnmanagedArrayUtility.NewAndInit<long>(_count);
|
||||
_handler = MemoryAllocator.AllocAndInit<int>(_count * 2 + _count);
|
||||
_versions = _handler.As<long>();
|
||||
_componentIDs = (int*)(_handler.As<long>() + _count);
|
||||
|
||||
var ptr = _componentIDs + 1;
|
||||
Marshal.Copy(mask._incs, 0, (IntPtr)ptr, mask._incs.Length);
|
||||
ptr += mask._incs.Length;
|
||||
Marshal.Copy(mask._excs, 0, (IntPtr)ptr, mask._excs.Length);
|
||||
ptr += mask._excs.Length;
|
||||
Marshal.Copy(mask._anys, 0, (IntPtr)ptr, mask._anys.Length);
|
||||
|
||||
_isNotOnlyExc = mask._incs.Length > 0 || mask._anys.Length > 0;
|
||||
}
|
||||
public bool Check()
|
||||
{
|
||||
@ -137,20 +156,10 @@ namespace DCFApixels.DragonECS.Core
|
||||
return true;
|
||||
}
|
||||
|
||||
long* versionsPtr = _versions;
|
||||
var slots = _world._poolSlots;
|
||||
foreach (var slotIndex in _maskInc)
|
||||
for (int i = 1; i < _count; i++)
|
||||
{
|
||||
versionsPtr++;
|
||||
if (*versionsPtr != slots[slotIndex].version)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
foreach (var slotIndex in _maskExc)
|
||||
{
|
||||
versionsPtr++;
|
||||
if (*versionsPtr != slots[slotIndex].version)
|
||||
if(_versions[i] == slots[_componentIDs[i]].version)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
@ -161,17 +170,10 @@ namespace DCFApixels.DragonECS.Core
|
||||
{
|
||||
*_versions = _world.Version;
|
||||
|
||||
long* versionsPtr = _versions;
|
||||
var slots = _world._poolSlots;
|
||||
foreach (var slotIndex in _maskInc)
|
||||
for (int i = 1; i < _count; i++)
|
||||
{
|
||||
versionsPtr++;
|
||||
*versionsPtr = slots[slotIndex].version;
|
||||
}
|
||||
foreach (var slotIndex in _maskExc)
|
||||
{
|
||||
versionsPtr++;
|
||||
*versionsPtr = slots[slotIndex].version;
|
||||
_versions[i] = slots[_componentIDs[i]].version;
|
||||
}
|
||||
}
|
||||
public bool CheckAndNext()
|
||||
@ -182,27 +184,14 @@ namespace DCFApixels.DragonECS.Core
|
||||
}
|
||||
*_versions = _world.Version;
|
||||
|
||||
long* versionsPtr = _versions;
|
||||
var slots = _world._poolSlots;
|
||||
// Так как проверки EXC работают не правильно при отсутсвии INC,
|
||||
// то проверки без INC должны всегда возвращать false.
|
||||
bool result = _maskInc.Length > 0;
|
||||
foreach (var slotIndex in _maskInc)
|
||||
bool result = _isNotOnlyExc;
|
||||
for (int i = 1; i < _count; i++)
|
||||
{
|
||||
versionsPtr++;
|
||||
if (*versionsPtr != slots[slotIndex].version)
|
||||
if (_versions[i] != slots[_componentIDs[i]].version)
|
||||
{
|
||||
result = false;
|
||||
*versionsPtr = slots[slotIndex].version;
|
||||
}
|
||||
}
|
||||
foreach (var slotIndex in _maskExc)
|
||||
{
|
||||
versionsPtr++;
|
||||
if (*versionsPtr != slots[slotIndex].version)
|
||||
{
|
||||
result = false;
|
||||
*versionsPtr = slots[slotIndex].version;
|
||||
_versions[i] = slots[_componentIDs[i]].version;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
@ -210,7 +199,7 @@ namespace DCFApixels.DragonECS.Core
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
UnmanagedArrayUtility.Free(_versions);
|
||||
MemoryAllocator.Free(_handler);
|
||||
}
|
||||
}
|
||||
}
|
@ -143,7 +143,11 @@ namespace DCFApixels.DragonECS.Core.Internal
|
||||
#endregion
|
||||
|
||||
#region Free
|
||||
public static void Free(ref Handler target)
|
||||
public static void Free(Handler target)
|
||||
{
|
||||
Free_Internal(target.GetHandledPtr());
|
||||
}
|
||||
public static void FreeAndClear(ref Handler target)
|
||||
{
|
||||
Free_Internal(target.GetHandledPtr());
|
||||
target = default;
|
||||
@ -335,7 +339,7 @@ namespace DCFApixels.DragonECS.Core.Internal
|
||||
{
|
||||
public static void Dispose(this ref MemoryAllocator.Handler self)
|
||||
{
|
||||
MemoryAllocator.Free(ref self);
|
||||
MemoryAllocator.FreeAndClear(ref self);
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user