This commit is contained in:
Mikhail 2026-04-16 15:14:15 +08:00
parent 0f8d619468
commit 91d196e1a9
5 changed files with 39 additions and 3 deletions

View File

@ -86,6 +86,7 @@ namespace DCFApixels.DragonECS
private StructList<IEcsWorldEventListener> _listeners = new StructList<IEcsWorldEventListener>(2); private StructList<IEcsWorldEventListener> _listeners = new StructList<IEcsWorldEventListener>(2);
private StructList<IEcsEntityEventListener> _entityListeners = new StructList<IEcsEntityEventListener>(2); private StructList<IEcsEntityEventListener> _entityListeners = new StructList<IEcsEntityEventListener>(2);
private bool _hasAnyEntityListener = false;
#region Properties #region Properties
EcsWorld IEntityStorage.World EcsWorld IEntityStorage.World
@ -394,7 +395,10 @@ namespace DCFApixels.DragonECS
{ {
slot.gen |= GEN_SLEEP_MASK; slot.gen |= GEN_SLEEP_MASK;
} }
_entityListeners.InvokeOnNewEntity(entityID); if (_hasAnyEntityListener)
{
_entityListeners.InvokeOnNewEntity(entityID);
}
MoveToEmptyEntities(entityID); MoveToEmptyEntities(entityID);
} }
@ -436,7 +440,10 @@ namespace DCFApixels.DragonECS
_delEntBuffer[_delEntBufferCount++] = entityID; _delEntBuffer[_delEntBufferCount++] = entityID;
_entities[entityID].isUsed = false; _entities[entityID].isUsed = false;
_entitiesCount--; _entitiesCount--;
_entityListeners.InvokeOnDelEntity(entityID); if (_hasAnyEntityListener)
{
_entityListeners.InvokeOnDelEntity(entityID);
}
} }
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
private void MoveToEmptyEntities(int entityID) private void MoveToEmptyEntities(int entityID)
@ -1045,10 +1052,12 @@ namespace DCFApixels.DragonECS
public void AddListener(IEcsEntityEventListener entityEventListener) public void AddListener(IEcsEntityEventListener entityEventListener)
{ {
_entityListeners.Add(entityEventListener); _entityListeners.Add(entityEventListener);
_hasAnyEntityListener = _entityListeners.Count > 0;
} }
public void RemoveListener(IEcsEntityEventListener entityEventListener) public void RemoveListener(IEcsEntityEventListener entityEventListener)
{ {
_entityListeners.Remove(entityEventListener); _entityListeners.Remove(entityEventListener);
_hasAnyEntityListener = _entityListeners.Count > 0;
} }
#endregion #endregion
@ -1374,6 +1383,7 @@ namespace DCFApixels.DragonECS
public interface IEcsEntityEventListener public interface IEcsEntityEventListener
{ {
void OnNewEntity(int entityID); void OnNewEntity(int entityID);
void OnMigrateEntity(int entityID);
void OnDelEntity(int entityID); void OnDelEntity(int entityID);
} }
internal static class WorldEventListExtensions internal static class WorldEventListExtensions
@ -1411,6 +1421,14 @@ namespace DCFApixels.DragonECS
} }
} }
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void InvokeOnMigrateEntity(this ref StructList<IEcsEntityEventListener> self, int entityID)
{
for (int i = 0, iMax = self.Count; i < iMax; i++)
{
self[i].OnMigrateEntity(entityID);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void InvokeOnDelEntity(this ref StructList<IEcsEntityEventListener> self, int entityID) public static void InvokeOnDelEntity(this ref StructList<IEcsEntityEventListener> self, int entityID)
{ {
for (int i = 0, iMax = self.Count; i < iMax; i++) for (int i = 0, iMax = self.Count; i < iMax; i++)

View File

@ -286,6 +286,10 @@ namespace DCFApixels.DragonECS
RemoveFromEmptyEntities(entityID); RemoveFromEmptyEntities(entityID);
} }
_entityComponentMasks[(entityID << _entityComponentMaskLengthBitShift) + maskBit.chunkIndex] |= maskBit.mask; _entityComponentMasks[(entityID << _entityComponentMaskLengthBitShift) + maskBit.chunkIndex] |= maskBit.mask;
if (_hasAnyEntityListener)
{
_entityListeners.InvokeOnMigrateEntity(entityID);
}
} }
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
private void UnregisterEntityComponent(int entityID, int componentTypeID, EcsMaskChunck maskBit) private void UnregisterEntityComponent(int entityID, int componentTypeID, EcsMaskChunck maskBit)
@ -296,12 +300,15 @@ namespace DCFApixels.DragonECS
slot.version++; slot.version++;
var count = --_entities[entityID].componentsCount; var count = --_entities[entityID].componentsCount;
_entityComponentMasks[(entityID << _entityComponentMaskLengthBitShift) + maskBit.chunkIndex] &= ~maskBit.mask; _entityComponentMasks[(entityID << _entityComponentMaskLengthBitShift) + maskBit.chunkIndex] &= ~maskBit.mask;
if (count == 0 && IsUsed(entityID)) if (count == 0 && IsUsed(entityID))
{ {
MoveToEmptyEntities(entityID); MoveToEmptyEntities(entityID);
} }
CheckUnregisterValid(count, entityID); CheckUnregisterValid(count, entityID);
if (_hasAnyEntityListener)
{
_entityListeners.InvokeOnMigrateEntity(entityID);
}
} }
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
private bool TryRegisterEntityComponent(int entityID, int componentTypeID, EcsMaskChunck maskBit) private bool TryRegisterEntityComponent(int entityID, int componentTypeID, EcsMaskChunck maskBit)
@ -320,6 +327,10 @@ namespace DCFApixels.DragonECS
{ {
RemoveFromEmptyEntities(entityID); RemoveFromEmptyEntities(entityID);
} }
if (_hasAnyEntityListener)
{
_entityListeners.InvokeOnMigrateEntity(entityID);
}
return true; return true;
} }
return false; return false;
@ -343,6 +354,10 @@ namespace DCFApixels.DragonECS
MoveToEmptyEntities(entityID); MoveToEmptyEntities(entityID);
} }
CheckUnregisterValid(count, entityID); CheckUnregisterValid(count, entityID);
if (_hasAnyEntityListener)
{
_entityListeners.InvokeOnMigrateEntity(entityID);
}
return true; return true;
} }
return false; return false;

View File

@ -160,6 +160,7 @@ namespace DCFApixels.DragonECS.Core.Internal
SortHalper.Sort(_filteredEntities.AsSpan(_filteredEntitiesCount), comparison); SortHalper.Sort(_filteredEntities.AsSpan(_filteredEntitiesCount), comparison);
return new EcsUnsafeSpan(World.ID, _filteredEntities.Ptr, _filteredEntitiesCount); return new EcsUnsafeSpan(World.ID, _filteredEntities.Ptr, _filteredEntitiesCount);
} }
public override EcsSpan Snapshot() { return Execute(); }
#endregion #endregion
} }
} }

View File

@ -117,6 +117,7 @@ namespace DCFApixels.DragonECS.Core.Internal
ExecuteFor_Iternal(span); ExecuteFor_Iternal(span);
return _filteredGroup; return _filteredGroup;
} }
public override EcsSpan Snapshot() { return Execute(); }
#endregion #endregion
} }
} }

View File

@ -105,6 +105,7 @@ namespace DCFApixels.DragonECS.Core
} }
protected abstract void OnInitialize(); protected abstract void OnInitialize();
protected abstract void OnDestroy(); protected abstract void OnDestroy();
public abstract EcsSpan Snapshot();
} }
#if ENABLE_IL2CPP #if ENABLE_IL2CPP