From 02fcd5f821a26cb2a56847c8fb7d881fcd7b2a8e Mon Sep 17 00:00:00 2001 From: Mikhail <99481254+DCFApixels@users.noreply.github.com> Date: Thu, 18 Apr 2024 00:36:05 +0800 Subject: [PATCH] simple optimization --- src/EcsAspect.cs | 12 ++++++++---- src/EcsWorld.cs | 10 ++++++++-- src/EcsWorld.pools.cs | 14 +++++++------- 3 files changed, 23 insertions(+), 13 deletions(-) diff --git a/src/EcsAspect.cs b/src/EcsAspect.cs index dca9a4e..fb48e88 100644 --- a/src/EcsAspect.cs +++ b/src/EcsAspect.cs @@ -270,6 +270,8 @@ namespace DCFApixels.DragonECS _span = span; this.aspect = aspect; } + + #region CopyTo public void CopyTo(EcsGroup group) { group.Clear(); @@ -298,6 +300,7 @@ namespace DCFApixels.DragonECS int count = CopyTo(ref array); return new EcsSpan(worldID, array, count); } + #endregion #region Other public override string ToString() @@ -353,7 +356,7 @@ namespace DCFApixels.DragonECS private UnsafeArray _sortIncChunckBuffer; private UnsafeArray _sortExcChunckBuffer; - private readonly int _entityComponentMaskBitShift; + private readonly int _entityComponentMaskLengthBitShift; public unsafe Enumerator(EcsSpan span, EcsAspect aspect) { @@ -361,8 +364,8 @@ namespace DCFApixels.DragonECS _sortIncChunckBuffer = aspect._sortIncChunckBuffer; _sortExcChunckBuffer = aspect._sortExcChunckBuffer; - _entityComponentMaskBitShift = aspect.World._entityComponentMaskLength; - _entityComponentMaskBitShift = BitsUtility.GetHighBitNumber(_entityComponentMaskBitShift); + //_entityComponentMaskBitShift = BitsUtility.GetHighBitNumber(aspect.World._entityComponentMaskLength); + _entityComponentMaskLengthBitShift = aspect.World._entityComponentMaskLengthBitShift; #region Sort UnsafeArray _sortIncBuffer = aspect._sortIncBuffer; @@ -438,6 +441,7 @@ namespace DCFApixels.DragonECS } } #endregion + _span = span.GetEnumerator(); } public int Current @@ -450,7 +454,7 @@ namespace DCFApixels.DragonECS { while (_span.MoveNext()) { - int chunck = _span.Current << _entityComponentMaskBitShift; + int chunck = _span.Current << _entityComponentMaskLengthBitShift; for (int i = 0; i < _sortIncChunckBuffer.Length; i++) { var bit = _sortIncChunckBuffer.ptr[i]; diff --git a/src/EcsWorld.cs b/src/EcsWorld.cs index e75d200..68b33d4 100644 --- a/src/EcsWorld.cs +++ b/src/EcsWorld.cs @@ -42,6 +42,7 @@ namespace DCFApixels.DragonECS private bool _isEnableAutoReleaseDelEntBuffer = true; internal int _entityComponentMaskLength; + internal int _entityComponentMaskLengthBitShift; internal int[] _entityComponentMasks = Array.Empty(); private const int COMPONENT_MASK_CHUNK_SIZE = 32; @@ -569,17 +570,22 @@ namespace DCFApixels.DragonECS _entityDispenser.Upsize(minSize); } [MethodImpl(MethodImplOptions.NoInlining)] - private int CalcEntityComponentMaskLastIndex() + private int CalcEntityComponentMaskLength() { int result = _pools.Length / COMPONENT_MASK_CHUNK_SIZE; return (result < 2 ? 2 : result); } + private void SetEntityComponentMaskLength(int value) + { + _entityComponentMaskLength = value; + _entityComponentMaskLengthBitShift = BitsUtility.GetHighBitNumber(value); + } [MethodImpl(MethodImplOptions.NoInlining)] private void OnEntityDispenserResized(int newSize) { + SetEntityComponentMaskLength(CalcEntityComponentMaskLength()); //_pools.Length / COMPONENT_MASK_CHUNK_SIZE + 1; Array.Resize(ref _entities, newSize); Array.Resize(ref _delEntBuffer, newSize); - _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 95ab769..b9372c1 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 = CalcEntityComponentMaskLastIndex(); //_pools.Length / COMPONENT_MASK_CHUNK_SIZE + 1; + int newEntityComponentMaskLength = CalcEntityComponentMaskLength(); //_pools.Length / COMPONENT_MASK_CHUNK_SIZE + 1; int dif = newEntityComponentMaskLength - _entityComponentMaskLength; if (dif > 0) { @@ -186,7 +186,7 @@ namespace DCFApixels.DragonECS newIndx += dif; nextIndx += _entityComponentMaskLength; } - _entityComponentMaskLength = newEntityComponentMaskLength; + SetEntityComponentMaskLength(newEntityComponentMaskLength); _entityComponentMasks = newEntityComponentMasks; } @@ -212,7 +212,7 @@ namespace DCFApixels.DragonECS UpVersion(); _poolComponentCounts[componentTypeID]++; _entities[entityID].componentsCount++; - _entityComponentMasks[entityID * _entityComponentMaskLength + maskBit.chankIndex] |= maskBit.mask; + _entityComponentMasks[(entityID << _entityComponentMaskLengthBitShift) + maskBit.chankIndex] |= maskBit.mask; } [MethodImpl(MethodImplOptions.AggressiveInlining)] private void UnregisterEntityComponent(int entityID, int componentTypeID, EcsMaskChunck maskBit) @@ -220,7 +220,7 @@ namespace DCFApixels.DragonECS UpVersion(); _poolComponentCounts[componentTypeID]--; var count = --_entities[entityID].componentsCount; - _entityComponentMasks[entityID * _entityComponentMaskLength + maskBit.chankIndex] &= ~maskBit.mask; + _entityComponentMasks[(entityID << _entityComponentMaskLengthBitShift) + maskBit.chankIndex] &= ~maskBit.mask; if (count == 0 && IsUsed(entityID)) { @@ -235,7 +235,7 @@ namespace DCFApixels.DragonECS [MethodImpl(MethodImplOptions.AggressiveInlining)] private bool TryRegisterEntityComponent(int entityID, int componentTypeID, EcsMaskChunck maskBit) { - ref int chunk = ref _entityComponentMasks[entityID * _entityComponentMaskLength + maskBit.chankIndex]; + ref int chunk = ref _entityComponentMasks[(entityID << _entityComponentMaskLengthBitShift) + maskBit.chankIndex]; int newChunk = chunk | maskBit.mask; if (chunk != newChunk) { @@ -249,7 +249,7 @@ namespace DCFApixels.DragonECS [MethodImpl(MethodImplOptions.AggressiveInlining)] private bool TryUnregisterEntityComponent(int entityID, int componentTypeID, EcsMaskChunck maskBit) { - ref int chunk = ref _entityComponentMasks[entityID * _entityComponentMaskLength + maskBit.chankIndex]; + ref int chunk = ref _entityComponentMasks[(entityID << _entityComponentMaskLengthBitShift) + maskBit.chankIndex]; int newChunk = chunk & ~maskBit.mask; if (chunk != newChunk) { @@ -277,7 +277,7 @@ namespace DCFApixels.DragonECS [MethodImpl(MethodImplOptions.AggressiveInlining)] private bool HasEntityComponent(int entityID, EcsMaskChunck maskBit) { - return (_entityComponentMasks[entityID * _entityComponentMaskLength + maskBit.chankIndex] & maskBit.mask) == maskBit.mask; + return (_entityComponentMasks[(entityID << _entityComponentMaskLengthBitShift) + maskBit.chankIndex] & maskBit.mask) == maskBit.mask; } #endregion