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;
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<EcsMaskChunck> _sortIncChunckBuffer;
private UnsafeArray<EcsMaskChunck> _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<int> _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];

View File

@ -42,6 +42,7 @@ namespace DCFApixels.DragonECS
private bool _isEnableAutoReleaseDelEntBuffer = true;
internal int _entityComponentMaskLength;
internal int _entityComponentMaskLengthBitShift;
internal int[] _entityComponentMasks = Array.Empty<int>();
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);

View File

@ -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