mirror of
https://github.com/DCFApixels/DragonECS.git
synced 2025-09-19 02:24:37 +08:00
update queries
This commit is contained in:
parent
0a22f35a6b
commit
acf0e876f3
@ -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;
|
||||||
|
_maskInc = mask._inc;
|
||||||
|
_maskExc = mask._exc;
|
||||||
|
_versions = UnmanagedArrayUtility.New<long>(1 + mask._inc.Length + mask._exc.Length);
|
||||||
|
}
|
||||||
|
public bool Check()
|
||||||
|
{
|
||||||
|
if (*_versions == _world.Version)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
long* ptr = _versions;
|
||||||
|
var slots = _world._poolSlots;
|
||||||
|
foreach (var slotIndex in _maskInc)
|
||||||
|
{
|
||||||
|
ptr++;
|
||||||
|
if (*ptr != slots[slotIndex].version)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
foreach (var slotIndex in _maskExc)
|
||||||
|
{
|
||||||
|
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;
|
bool result = true;
|
||||||
int index = 0;
|
foreach (var slotIndex in _maskInc)
|
||||||
foreach (var i in _mask._inc)
|
|
||||||
{
|
{
|
||||||
if (slots[i].version != _versions[index++])
|
ptr++;
|
||||||
|
if (*ptr != slots[slotIndex].version)
|
||||||
{
|
{
|
||||||
result = false;
|
result = false;
|
||||||
|
*ptr = slots[slotIndex].version;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
foreach (var i in _mask._exc)
|
foreach (var slotIndex in _maskExc)
|
||||||
{
|
{
|
||||||
if (slots[i].version != _versions[index++])
|
ptr++;
|
||||||
|
if (*ptr != slots[slotIndex].version)
|
||||||
{
|
{
|
||||||
result = false;
|
result = false;
|
||||||
|
*ptr = slots[slotIndex].version;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -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)
|
||||||
|
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user