update queries

This commit is contained in:
Mikhail 2024-10-11 18:28:46 +08:00
parent 0a22f35a6b
commit acf0e876f3
3 changed files with 99 additions and 28 deletions

View File

@ -1,4 +1,5 @@
using System; using DCFApixels.DragonECS.Internal;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
@ -55,37 +56,107 @@ namespace DCFApixels.DragonECS
protected abstract void OnDestroy(); protected abstract void OnDestroy();
} }
public readonly struct PoolVersionsChecker public readonly unsafe struct WorldStateVersionsChecker : IDisposable
{ {
private readonly EcsMask _mask; private readonly EcsWorld _world;
private readonly long[] _versions; private readonly int[] _maskInc;
private readonly int[] _maskExc;
public PoolVersionsChecker(EcsMask mask) // [0] world version
// [-> _maskInc.Length] inc versions
// [-> _maskExc.Length] exc versions
private readonly long* _versions;
public long Version
{ {
_mask = mask; [MethodImpl(MethodImplOptions.AggressiveInlining)]
_versions = new long[mask._inc.Length + mask._exc.Length]; get { return _versions[0]; }
} }
public bool NextEquals() public WorldStateVersionsChecker(EcsMask mask)
{ {
var slots = _mask.World._poolSlots; _world = mask.World;
bool result = true; _maskInc = mask._inc;
int index = 0; _maskExc = mask._exc;
foreach (var i in _mask._inc) _versions = UnmanagedArrayUtility.New<long>(1 + mask._inc.Length + mask._exc.Length);
}
public bool Check()
{
if (*_versions == _world.Version)
{ {
if (slots[i].version != _versions[index++]) return true;
}
long* ptr = _versions;
var slots = _world._poolSlots;
foreach (var slotIndex in _maskInc)
{
ptr++;
if (*ptr != slots[slotIndex].version)
{ {
result = false; return false;
} }
} }
foreach (var i in _mask._exc) foreach (var slotIndex in _maskExc)
{ {
if (slots[i].version != _versions[index++]) ptr++;
if (*ptr != slots[slotIndex].version)
{
return false;
}
}
return true;
}
public void Next()
{
*_versions = _world.Version;
long* ptr = _versions;
var slots = _world._poolSlots;
foreach (var slotIndex in _maskInc)
{
ptr++;
*ptr = slots[slotIndex].version;
}
foreach (var slotIndex in _maskExc)
{
ptr++;
*ptr = slots[slotIndex].version;
}
}
public bool CheckAndNext()
{
if (*_versions == _world.Version)
{
return true;
}
*_versions = _world.Version;
long* ptr = _versions;
var slots = _world._poolSlots;
bool result = true;
foreach (var slotIndex in _maskInc)
{
ptr++;
if (*ptr != slots[slotIndex].version)
{ {
result = false; result = false;
*ptr = slots[slotIndex].version;
}
}
foreach (var slotIndex in _maskExc)
{
ptr++;
if (*ptr != slots[slotIndex].version)
{
result = false;
*ptr = slots[slotIndex].version;
} }
} }
return result; return result;
} }
public void Dispose()
{
}
} }
} }

View File

@ -20,8 +20,7 @@ namespace DCFApixels.DragonECS.Internal
private int[] _filteredEntities = null; private int[] _filteredEntities = null;
private int _filteredEntitiesCount = 0; private int _filteredEntitiesCount = 0;
private long _lastWorldVersion = 0; private WorldStateVersionsChecker _versionsChecker;
private PoolVersionsChecker _versionsChecker;
#region Properties #region Properties
public sealed override long Version public sealed override long Version
@ -34,10 +33,13 @@ namespace DCFApixels.DragonECS.Internal
#region OnInitialize/OnDestroy #region OnInitialize/OnDestroy
protected sealed override void OnInitialize() protected sealed override void OnInitialize()
{ {
_versionsChecker = new PoolVersionsChecker(Mask); _versionsChecker = new WorldStateVersionsChecker(Mask);
_iterator = Mask.GetIterator(); _iterator = Mask.GetIterator();
} }
protected sealed override void OnDestroy() { } protected sealed override void OnDestroy()
{
_versionsChecker.Dispose();
}
#endregion #endregion
#region Methods #region Methods
@ -45,12 +47,11 @@ namespace DCFApixels.DragonECS.Internal
private void Execute_Iternal() private void Execute_Iternal()
{ {
World.ReleaseDelEntityBufferAllAuto(); World.ReleaseDelEntityBufferAllAuto();
if (_lastWorldVersion != World.Version || _versionsChecker.NextEquals() == false) if (_versionsChecker.CheckAndNext() == false)
{ {
_version++; _version++;
_filteredAllEntitiesCount = _iterator.IterateTo(World.Entities, ref _filteredAllEntities); _filteredAllEntitiesCount = _iterator.IterateTo(World.Entities, ref _filteredAllEntities);
} }
_lastWorldVersion = World.Version;
} }
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
private void ExecuteFor_Iternal(EcsSpan span) private void ExecuteFor_Iternal(EcsSpan span)

View File

@ -17,8 +17,7 @@ namespace DCFApixels.DragonECS.Internal
private EcsGroup _filteredGroup; private EcsGroup _filteredGroup;
private long _lastWorldVersion; private WorldStateVersionsChecker _versionsChecker;
private PoolVersionsChecker _versionsChecker;
#region Properties #region Properties
public sealed override long Version public sealed override long Version
@ -31,13 +30,14 @@ namespace DCFApixels.DragonECS.Internal
#region OnInitialize/OnDestroy #region OnInitialize/OnDestroy
protected sealed override void OnInitialize() protected sealed override void OnInitialize()
{ {
_versionsChecker = new PoolVersionsChecker(Mask); _versionsChecker = new WorldStateVersionsChecker(Mask);
_filteredAllGroup = EcsGroup.New(World); _filteredAllGroup = EcsGroup.New(World);
_iterator = Mask.GetIterator(); _iterator = Mask.GetIterator();
} }
protected sealed override void OnDestroy() protected sealed override void OnDestroy()
{ {
_filteredAllGroup.Dispose(); _filteredAllGroup.Dispose();
_versionsChecker.Dispose();
} }
#endregion #endregion
@ -46,12 +46,11 @@ namespace DCFApixels.DragonECS.Internal
private void Execute_Iternal() private void Execute_Iternal()
{ {
World.ReleaseDelEntityBufferAllAuto(); World.ReleaseDelEntityBufferAllAuto();
if (_lastWorldVersion != World.Version || _versionsChecker.NextEquals() == false) if (_versionsChecker.CheckAndNext() == false)
{ {
_version++; _version++;
_iterator.IterateTo(World.Entities, _filteredAllGroup); _iterator.IterateTo(World.Entities, _filteredAllGroup);
} }
_lastWorldVersion = World.Version;
} }
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
private void ExecuteFor_Iternal(EcsSpan span) private void ExecuteFor_Iternal(EcsSpan span)