mini optimization

This commit is contained in:
Mikhail 2024-04-27 19:05:05 +08:00
parent 0fc0e1f7e4
commit 80a6963699
3 changed files with 48 additions and 15 deletions

View File

@ -26,6 +26,7 @@ namespace DCFApixels.DragonECS
private bool _isHasComponentCopyHandler = EcsComponentCopyHandler<T>.isHasHandler; private bool _isHasComponentCopyHandler = EcsComponentCopyHandler<T>.isHasHandler;
private List<IEcsPoolEventListener> _listeners = new List<IEcsPoolEventListener>(); private List<IEcsPoolEventListener> _listeners = new List<IEcsPoolEventListener>();
private int _listenersCachedCount = 0;
private EcsWorld.PoolsMediator _mediator; private EcsWorld.PoolsMediator _mediator;
@ -78,7 +79,7 @@ namespace DCFApixels.DragonECS
} }
_mediator.RegisterComponent(entityID, _componentTypeID, _maskBit); _mediator.RegisterComponent(entityID, _componentTypeID, _maskBit);
EnableComponent(ref _items[itemIndex]); EnableComponent(ref _items[itemIndex]);
_listeners.InvokeOnAddAndGet(entityID); _listeners.InvokeOnAddAndGet(entityID, _listenersCachedCount);
return ref _items[itemIndex]; return ref _items[itemIndex];
} }
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
@ -87,7 +88,7 @@ namespace DCFApixels.DragonECS
#if (DEBUG && !DISABLE_DEBUG) || ENABLE_DRAGONECS_ASSERT_CHEKS #if (DEBUG && !DISABLE_DEBUG) || ENABLE_DRAGONECS_ASSERT_CHEKS
if (!Has(entityID)) { EcsPoolThrowHalper.ThrowNotHaveComponent<T>(entityID); } if (!Has(entityID)) { EcsPoolThrowHalper.ThrowNotHaveComponent<T>(entityID); }
#endif #endif
_listeners.InvokeOnGet(entityID); _listeners.InvokeOnGet(entityID, _listenersCachedCount);
return ref _items[_mapping[entityID]]; return ref _items[_mapping[entityID]];
} }
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
@ -118,9 +119,9 @@ namespace DCFApixels.DragonECS
} }
_mediator.RegisterComponent(entityID, _componentTypeID, _maskBit); _mediator.RegisterComponent(entityID, _componentTypeID, _maskBit);
EnableComponent(ref _items[itemIndex]); EnableComponent(ref _items[itemIndex]);
_listeners.InvokeOnAdd(entityID); _listeners.InvokeOnAdd(entityID, _listenersCachedCount);
} }
_listeners.InvokeOnGet(entityID); _listeners.InvokeOnGet(entityID, _listenersCachedCount);
return ref _items[itemIndex]; return ref _items[itemIndex];
} }
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
@ -143,7 +144,7 @@ namespace DCFApixels.DragonECS
itemIndex = 0; itemIndex = 0;
_itemsCount--; _itemsCount--;
_mediator.UnregisterComponent(entityID, _componentTypeID, _maskBit); _mediator.UnregisterComponent(entityID, _componentTypeID, _maskBit);
_listeners.InvokeOnDel(entityID); _listeners.InvokeOnDel(entityID, _listenersCachedCount);
} }
public void TryDel(int entityID) public void TryDel(int entityID)
{ {
@ -178,7 +179,7 @@ namespace DCFApixels.DragonECS
DisableComponent(ref _items[itemIndex]); DisableComponent(ref _items[itemIndex]);
itemIndex = 0; itemIndex = 0;
_mediator.UnregisterComponent(entityID, _componentTypeID, _maskBit); _mediator.UnregisterComponent(entityID, _componentTypeID, _maskBit);
_listeners.InvokeOnDel(entityID); _listeners.InvokeOnDel(entityID, _listenersCachedCount);
} }
} }
#endregion #endregion
@ -230,11 +231,15 @@ namespace DCFApixels.DragonECS
{ {
if (listener == null) { throw new ArgumentNullException("listener is null"); } if (listener == null) { throw new ArgumentNullException("listener is null"); }
_listeners.Add(listener); _listeners.Add(listener);
_listenersCachedCount++;
} }
public void RemoveListener(IEcsPoolEventListener listener) public void RemoveListener(IEcsPoolEventListener listener)
{ {
if (listener == null) { throw new ArgumentNullException("listener is null"); } if (listener == null) { throw new ArgumentNullException("listener is null"); }
_listeners.Remove(listener); if (_listeners.Remove(listener))
{
_listenersCachedCount--;
}
} }
#endregion #endregion

View File

@ -202,26 +202,49 @@ namespace DCFApixels.DragonECS
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void InvokeOnAdd(this List<IEcsPoolEventListener> self, int entityID) public static void InvokeOnAdd(this List<IEcsPoolEventListener> self, int entityID)
{ {
for (int i = 0, iMax = self.Count; i < iMax; i++) self[i].OnAdd(entityID); self.InvokeOnAdd(entityID, self.Count);
} }
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void InvokeOnAdd(this List<IEcsPoolEventListener> self, int entityID, int cachedCount)
{
for (int i = 0; i < cachedCount; i++) self[i].OnAdd(entityID);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void InvokeOnAddAndGet(this List<IEcsPoolEventListener> self, int entityID) public static void InvokeOnAddAndGet(this List<IEcsPoolEventListener> self, int entityID)
{ {
for (int i = 0, iMax = self.Count; i < iMax; i++) self.InvokeOnAddAndGet(entityID, self.Count);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void InvokeOnAddAndGet(this List<IEcsPoolEventListener> self, int entityID, int cachedCount)
{
for (int i = 0; i < cachedCount; i++)
{ {
self[i].OnAdd(entityID); self[i].OnAdd(entityID);
self[i].OnGet(entityID); self[i].OnGet(entityID);
} }
} }
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void InvokeOnGet(this List<IEcsPoolEventListener> self, int entityID) public static void InvokeOnGet(this List<IEcsPoolEventListener> self, int entityID)
{ {
for (int i = 0, iMax = self.Count; i < iMax; i++) self[i].OnGet(entityID); self.InvokeOnGet(entityID, self.Count);
} }
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal static void InvokeOnGet(this List<IEcsPoolEventListener> self, int entityID, int cachedCount)
{
for (int i = 1; i < cachedCount; i++) self[i].OnGet(entityID);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void InvokeOnDel(this List<IEcsPoolEventListener> self, int entityID) public static void InvokeOnDel(this List<IEcsPoolEventListener> self, int entityID)
{ {
for (int i = 0, iMax = self.Count; i < iMax; i++) self[i].OnDel(entityID); self.InvokeOnDel(entityID, self.Count);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void InvokeOnDel(this List<IEcsPoolEventListener> self, int entityID, int cachedCount)
{
for (int i = 0; i < cachedCount; i++) self[i].OnDel(entityID);
} }
} }
#endregion #endregion

View File

@ -17,6 +17,7 @@ namespace DCFApixels.DragonECS
private int _count = 0; private int _count = 0;
private List<IEcsPoolEventListener> _listeners = new List<IEcsPoolEventListener>(); private List<IEcsPoolEventListener> _listeners = new List<IEcsPoolEventListener>();
private int _listenersCachedCount = 0;
private T _fakeComponent; private T _fakeComponent;
private EcsWorld.PoolsMediator _mediator; private EcsWorld.PoolsMediator _mediator;
@ -72,7 +73,7 @@ namespace DCFApixels.DragonECS
_count++; _count++;
_mapping[entityID] = true; _mapping[entityID] = true;
_mediator.RegisterComponent(entityID, _componentTypeID, _maskBit); _mediator.RegisterComponent(entityID, _componentTypeID, _maskBit);
_listeners.InvokeOnAdd(entityID); _listeners.InvokeOnAdd(entityID, _listenersCachedCount);
} }
public void TryAdd(int entityID) public void TryAdd(int entityID)
{ {
@ -94,7 +95,7 @@ namespace DCFApixels.DragonECS
_mapping[entityID] = false; _mapping[entityID] = false;
_count--; _count--;
_mediator.UnregisterComponent(entityID, _componentTypeID, _maskBit); _mediator.UnregisterComponent(entityID, _componentTypeID, _maskBit);
_listeners.InvokeOnDel(entityID); _listeners.InvokeOnDel(entityID, _listenersCachedCount);
} }
public void TryDel(int entityID) public void TryDel(int entityID)
{ {
@ -154,7 +155,7 @@ namespace DCFApixels.DragonECS
{ {
_mapping[entityID] = false; _mapping[entityID] = false;
_mediator.UnregisterComponent(entityID, _componentTypeID, _maskBit); _mediator.UnregisterComponent(entityID, _componentTypeID, _maskBit);
_listeners.InvokeOnDel(entityID); _listeners.InvokeOnDel(entityID, _listenersCachedCount);
} }
} }
#endregion #endregion
@ -229,11 +230,15 @@ namespace DCFApixels.DragonECS
{ {
if (listener == null) { throw new ArgumentNullException("listener is null"); } if (listener == null) { throw new ArgumentNullException("listener is null"); }
_listeners.Add(listener); _listeners.Add(listener);
_listenersCachedCount++;
} }
public void RemoveListener(IEcsPoolEventListener listener) public void RemoveListener(IEcsPoolEventListener listener)
{ {
if (listener == null) { throw new ArgumentNullException("listener is null"); } if (listener == null) { throw new ArgumentNullException("listener is null"); }
_listeners.Remove(listener); if (_listeners.Remove(listener))
{
_listenersCachedCount--;
}
} }
#endregion #endregion