simple optimization

This commit is contained in:
Mikhail 2024-04-18 00:36:05 +08:00
parent ee500fadfd
commit 02fcd5f821
3 changed files with 23 additions and 13 deletions

View File

@ -270,6 +270,8 @@ namespace DCFApixels.DragonECS
_span = span; _span = span;
this.aspect = aspect; this.aspect = aspect;
} }
#region CopyTo
public void CopyTo(EcsGroup group) public void CopyTo(EcsGroup group)
{ {
group.Clear(); group.Clear();
@ -298,6 +300,7 @@ namespace DCFApixels.DragonECS
int count = CopyTo(ref array); int count = CopyTo(ref array);
return new EcsSpan(worldID, array, count); return new EcsSpan(worldID, array, count);
} }
#endregion
#region Other #region Other
public override string ToString() public override string ToString()
@ -353,7 +356,7 @@ namespace DCFApixels.DragonECS
private UnsafeArray<EcsMaskChunck> _sortIncChunckBuffer; private UnsafeArray<EcsMaskChunck> _sortIncChunckBuffer;
private UnsafeArray<EcsMaskChunck> _sortExcChunckBuffer; private UnsafeArray<EcsMaskChunck> _sortExcChunckBuffer;
private readonly int _entityComponentMaskBitShift; private readonly int _entityComponentMaskLengthBitShift;
public unsafe Enumerator(EcsSpan span, EcsAspect aspect) public unsafe Enumerator(EcsSpan span, EcsAspect aspect)
{ {
@ -361,8 +364,8 @@ namespace DCFApixels.DragonECS
_sortIncChunckBuffer = aspect._sortIncChunckBuffer; _sortIncChunckBuffer = aspect._sortIncChunckBuffer;
_sortExcChunckBuffer = aspect._sortExcChunckBuffer; _sortExcChunckBuffer = aspect._sortExcChunckBuffer;
_entityComponentMaskBitShift = aspect.World._entityComponentMaskLength; //_entityComponentMaskBitShift = BitsUtility.GetHighBitNumber(aspect.World._entityComponentMaskLength);
_entityComponentMaskBitShift = BitsUtility.GetHighBitNumber(_entityComponentMaskBitShift); _entityComponentMaskLengthBitShift = aspect.World._entityComponentMaskLengthBitShift;
#region Sort #region Sort
UnsafeArray<int> _sortIncBuffer = aspect._sortIncBuffer; UnsafeArray<int> _sortIncBuffer = aspect._sortIncBuffer;
@ -438,6 +441,7 @@ namespace DCFApixels.DragonECS
} }
} }
#endregion #endregion
_span = span.GetEnumerator(); _span = span.GetEnumerator();
} }
public int Current public int Current
@ -450,7 +454,7 @@ namespace DCFApixels.DragonECS
{ {
while (_span.MoveNext()) while (_span.MoveNext())
{ {
int chunck = _span.Current << _entityComponentMaskBitShift; int chunck = _span.Current << _entityComponentMaskLengthBitShift;
for (int i = 0; i < _sortIncChunckBuffer.Length; i++) for (int i = 0; i < _sortIncChunckBuffer.Length; i++)
{ {
var bit = _sortIncChunckBuffer.ptr[i]; var bit = _sortIncChunckBuffer.ptr[i];

View File

@ -42,6 +42,7 @@ namespace DCFApixels.DragonECS
private bool _isEnableAutoReleaseDelEntBuffer = true; private bool _isEnableAutoReleaseDelEntBuffer = true;
internal int _entityComponentMaskLength; internal int _entityComponentMaskLength;
internal int _entityComponentMaskLengthBitShift;
internal int[] _entityComponentMasks = Array.Empty<int>(); internal int[] _entityComponentMasks = Array.Empty<int>();
private const int COMPONENT_MASK_CHUNK_SIZE = 32; private const int COMPONENT_MASK_CHUNK_SIZE = 32;
@ -569,17 +570,22 @@ namespace DCFApixels.DragonECS
_entityDispenser.Upsize(minSize); _entityDispenser.Upsize(minSize);
} }
[MethodImpl(MethodImplOptions.NoInlining)] [MethodImpl(MethodImplOptions.NoInlining)]
private int CalcEntityComponentMaskLastIndex() private int CalcEntityComponentMaskLength()
{ {
int result = _pools.Length / COMPONENT_MASK_CHUNK_SIZE; int result = _pools.Length / COMPONENT_MASK_CHUNK_SIZE;
return (result < 2 ? 2 : result); return (result < 2 ? 2 : result);
} }
private void SetEntityComponentMaskLength(int value)
{
_entityComponentMaskLength = value;
_entityComponentMaskLengthBitShift = BitsUtility.GetHighBitNumber(value);
}
[MethodImpl(MethodImplOptions.NoInlining)] [MethodImpl(MethodImplOptions.NoInlining)]
private void OnEntityDispenserResized(int newSize) private void OnEntityDispenserResized(int newSize)
{ {
SetEntityComponentMaskLength(CalcEntityComponentMaskLength()); //_pools.Length / COMPONENT_MASK_CHUNK_SIZE + 1;
Array.Resize(ref _entities, newSize); Array.Resize(ref _entities, newSize);
Array.Resize(ref _delEntBuffer, newSize); Array.Resize(ref _delEntBuffer, newSize);
_entityComponentMaskLength = CalcEntityComponentMaskLastIndex(); //_pools.Length / COMPONENT_MASK_CHUNK_SIZE + 1;
Array.Resize(ref _entityComponentMasks, newSize * _entityComponentMaskLength); Array.Resize(ref _entityComponentMasks, newSize * _entityComponentMaskLength);
ArrayUtility.Fill(_entities, EntitySlot.Empty, _entitiesCapacity); ArrayUtility.Fill(_entities, EntitySlot.Empty, _entitiesCapacity);

View File

@ -166,7 +166,7 @@ namespace DCFApixels.DragonECS
Array.Resize(ref _poolComponentCounts, _pools.Length); Array.Resize(ref _poolComponentCounts, _pools.Length);
ArrayUtility.Fill(_pools, _nullPool, oldCapacity, oldCapacity - _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; int dif = newEntityComponentMaskLength - _entityComponentMaskLength;
if (dif > 0) if (dif > 0)
{ {
@ -186,7 +186,7 @@ namespace DCFApixels.DragonECS
newIndx += dif; newIndx += dif;
nextIndx += _entityComponentMaskLength; nextIndx += _entityComponentMaskLength;
} }
_entityComponentMaskLength = newEntityComponentMaskLength; SetEntityComponentMaskLength(newEntityComponentMaskLength);
_entityComponentMasks = newEntityComponentMasks; _entityComponentMasks = newEntityComponentMasks;
} }
@ -212,7 +212,7 @@ namespace DCFApixels.DragonECS
UpVersion(); UpVersion();
_poolComponentCounts[componentTypeID]++; _poolComponentCounts[componentTypeID]++;
_entities[entityID].componentsCount++; _entities[entityID].componentsCount++;
_entityComponentMasks[entityID * _entityComponentMaskLength + maskBit.chankIndex] |= maskBit.mask; _entityComponentMasks[(entityID << _entityComponentMaskLengthBitShift) + maskBit.chankIndex] |= maskBit.mask;
} }
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
private void UnregisterEntityComponent(int entityID, int componentTypeID, EcsMaskChunck maskBit) private void UnregisterEntityComponent(int entityID, int componentTypeID, EcsMaskChunck maskBit)
@ -220,7 +220,7 @@ namespace DCFApixels.DragonECS
UpVersion(); UpVersion();
_poolComponentCounts[componentTypeID]--; _poolComponentCounts[componentTypeID]--;
var count = --_entities[entityID].componentsCount; var count = --_entities[entityID].componentsCount;
_entityComponentMasks[entityID * _entityComponentMaskLength + maskBit.chankIndex] &= ~maskBit.mask; _entityComponentMasks[(entityID << _entityComponentMaskLengthBitShift) + maskBit.chankIndex] &= ~maskBit.mask;
if (count == 0 && IsUsed(entityID)) if (count == 0 && IsUsed(entityID))
{ {
@ -235,7 +235,7 @@ namespace DCFApixels.DragonECS
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
private bool TryRegisterEntityComponent(int entityID, int componentTypeID, EcsMaskChunck maskBit) 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; int newChunk = chunk | maskBit.mask;
if (chunk != newChunk) if (chunk != newChunk)
{ {
@ -249,7 +249,7 @@ namespace DCFApixels.DragonECS
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
private bool TryUnregisterEntityComponent(int entityID, int componentTypeID, EcsMaskChunck maskBit) 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; int newChunk = chunk & ~maskBit.mask;
if (chunk != newChunk) if (chunk != newChunk)
{ {
@ -277,7 +277,7 @@ namespace DCFApixels.DragonECS
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
private bool HasEntityComponent(int entityID, EcsMaskChunck maskBit) 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 #endregion