From d98cce379dca93b16ce518fa916cfc89731be7eb Mon Sep 17 00:00:00 2001 From: Mikhail <99481254+DCFApixels@users.noreply.github.com> Date: Mon, 8 Apr 2024 17:11:06 +0800 Subject: [PATCH 1/2] fix queries --- src/EcsAspect.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/EcsAspect.cs b/src/EcsAspect.cs index fa19726..3b03bcb 100644 --- a/src/EcsAspect.cs +++ b/src/EcsAspect.cs @@ -457,7 +457,7 @@ namespace DCFApixels.DragonECS for (int i = 0; i < _sortExcChunckBuffer.Length; i++) { var bit = _sortExcChunckBuffer.ptr[i]; - if ((_entityComponentMasks[e * _entityComponentMaskLength + bit.chankIndex] & bit.mask) > 0) + if ((_entityComponentMasks[e * _entityComponentMaskLength + bit.chankIndex] & bit.mask) != 0) { goto skip; } From 07e83194752d0bb48cae3ff07130a407d599d217 Mon Sep 17 00:00:00 2001 From: Mikhail <99481254+DCFApixels@users.noreply.github.com> Date: Mon, 8 Apr 2024 23:49:56 +0800 Subject: [PATCH 2/2] optimization --- src/EcsAspect.cs | 19 ++++++++++++------- src/EcsWorld.cs | 7 ++++++- src/EcsWorld.pools.cs | 2 +- 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/EcsAspect.cs b/src/EcsAspect.cs index 3b03bcb..589ae24 100644 --- a/src/EcsAspect.cs +++ b/src/EcsAspect.cs @@ -353,16 +353,16 @@ namespace DCFApixels.DragonECS private UnsafeArray _sortIncChunckBuffer; private UnsafeArray _sortExcChunckBuffer; - private readonly int _entityComponentMaskLength; + private readonly int _entityComponentMaskBitShift; public unsafe Enumerator(EcsSpan span, EcsAspect aspect) { - _span = span.GetEnumerator(); _entityComponentMasks = aspect.World._entityComponentMasks; _sortIncChunckBuffer = aspect._sortIncChunckBuffer; _sortExcChunckBuffer = aspect._sortExcChunckBuffer; - _entityComponentMaskLength = aspect.World._entityComponentMaskLength; + _entityComponentMaskBitShift = aspect.World._entityComponentMaskLength; + _entityComponentMaskBitShift = BitsUtility.GetHighBitNumber(_entityComponentMaskBitShift); #region Sort UnsafeArray _sortIncBuffer = aspect._sortIncBuffer; @@ -403,7 +403,11 @@ namespace DCFApixels.DragonECS } } } - + if (_sortIncChunckBuffer.Length > 0 && counts[_sortIncBuffer.ptr[0]] <= 0) + { + _span = span.Slice(0, 0).GetEnumerator(); + return; + } if (_sortExcChunckBuffer.Length > 1) { ExcCountComparer excComparer = new ExcCountComparer(counts); @@ -434,6 +438,7 @@ namespace DCFApixels.DragonECS } } #endregion + _span = span.GetEnumerator(); } public int Current { @@ -445,11 +450,11 @@ namespace DCFApixels.DragonECS { while (_span.MoveNext()) { - int e = _span.Current; + int chunck = _span.Current << _entityComponentMaskBitShift; for (int i = 0; i < _sortIncChunckBuffer.Length; i++) { var bit = _sortIncChunckBuffer.ptr[i]; - if ((_entityComponentMasks[e * _entityComponentMaskLength + bit.chankIndex] & bit.mask) != bit.mask) + if ((_entityComponentMasks[chunck + bit.chankIndex] & bit.mask) != bit.mask) { goto skip; } @@ -457,7 +462,7 @@ namespace DCFApixels.DragonECS for (int i = 0; i < _sortExcChunckBuffer.Length; i++) { var bit = _sortExcChunckBuffer.ptr[i]; - if ((_entityComponentMasks[e * _entityComponentMaskLength + bit.chankIndex] & bit.mask) != 0) + if ((_entityComponentMasks[chunck + bit.chankIndex] & bit.mask) != 0) { goto skip; } diff --git a/src/EcsWorld.cs b/src/EcsWorld.cs index 798e2a5..b1900a1 100644 --- a/src/EcsWorld.cs +++ b/src/EcsWorld.cs @@ -544,12 +544,17 @@ namespace DCFApixels.DragonECS { _entityDispenser.Upsize(minSize); } + private int CalcEntityComponentMaskLastIndex() + { + int result = _pools.Length / COMPONENT_MASK_CHUNK_SIZE; + return (result < 2 ? 2 : result); + } [MethodImpl(MethodImplOptions.NoInlining)] private void OnEntityDispenserResized(int newSize) { Array.Resize(ref _entities, newSize); Array.Resize(ref _delEntBuffer, newSize); - _entityComponentMaskLength = _pools.Length / COMPONENT_MASK_CHUNK_SIZE + 1; + _entityComponentMaskLength = CalcEntityComponentMaskLastIndex();//_pools.Length / COMPONENT_MASK_CHUNK_SIZE + 1; Array.Resize(ref _entityComponentMasks, newSize * _entityComponentMaskLength); ArrayUtility.Fill(_entities, EntitySlot.Empty, _entitiesCapacity); diff --git a/src/EcsWorld.pools.cs b/src/EcsWorld.pools.cs index ee980cd..95ab769 100644 --- a/src/EcsWorld.pools.cs +++ b/src/EcsWorld.pools.cs @@ -166,7 +166,7 @@ namespace DCFApixels.DragonECS Array.Resize(ref _poolComponentCounts, _pools.Length); ArrayUtility.Fill(_pools, _nullPool, oldCapacity, oldCapacity - _pools.Length); - int newEntityComponentMaskLength = _pools.Length / COMPONENT_MASK_CHUNK_SIZE + 1; + int newEntityComponentMaskLength = CalcEntityComponentMaskLastIndex(); //_pools.Length / COMPONENT_MASK_CHUNK_SIZE + 1; int dif = newEntityComponentMaskLength - _entityComponentMaskLength; if (dif > 0) {