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