mirror of
https://github.com/DCFApixels/DragonECS.git
synced 2025-09-17 17:34:36 +08:00
simple optimization
This commit is contained in:
parent
ee500fadfd
commit
02fcd5f821
@ -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];
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user