update pools

This commit is contained in:
DCFApixels 2024-12-04 16:10:09 +08:00
parent d107d29482
commit 450e98f0cd
5 changed files with 132 additions and 51 deletions

View File

@ -113,9 +113,6 @@ namespace DCFApixels.DragonECS
private EcsWorld _world; private EcsWorld _world;
private EcsStaticMask.Builder _maskBuilder; private EcsStaticMask.Builder _maskBuilder;
//private IEcsPool[] _poolsBuffer = new IEcsPool[8];
//private int _poolsBufferCount;
#region Properties #region Properties
public IncludeMarker Inc public IncludeMarker Inc
{ {
@ -219,11 +216,6 @@ namespace DCFApixels.DragonECS
private TPool CachePool<TPool>() where TPool : IEcsPoolImplementation, new() private TPool CachePool<TPool>() where TPool : IEcsPoolImplementation, new()
{ {
var pool = _world.GetPoolInstance<TPool>(); var pool = _world.GetPoolInstance<TPool>();
//if (_poolsBufferCount >= _poolsBuffer.Length)
//{
// Array.Resize(ref _poolsBuffer, _poolsBuffer.Length << 1);
//}
//_poolsBuffer[_poolsBufferCount++] = pool;
return pool; return pool;
} }
private void IncludeImplicit(Type type) private void IncludeImplicit(Type type)
@ -374,25 +366,25 @@ namespace DCFApixels.DragonECS
#endregion #endregion
} }
#region EcsAspectExtensions #region EcsAspect.Builder.Extensions
//public static class EcsAspectExtensions public static class EcsAspectBuilderExtensions
//{ {
// public static EcsAspect.Builder Inc<TPool>(this EcsAspect.Builder self, ref TPool pool) where TPool : IEcsPoolImplementation, new() public static EcsAspect.Builder Inc<TPool>(this EcsAspect.Builder self, ref TPool pool) where TPool : IEcsPoolImplementation, new()
// { {
// pool = self.IncludePool<TPool>(); pool = self.IncludePool<TPool>();
// return self; return self;
// } }
// public static EcsAspect.Builder Exc<TPool>(this EcsAspect.Builder self, ref TPool pool) where TPool : IEcsPoolImplementation, new() public static EcsAspect.Builder Exc<TPool>(this EcsAspect.Builder self, ref TPool pool) where TPool : IEcsPoolImplementation, new()
// { {
// pool = self.ExcludePool<TPool>(); pool = self.ExcludePool<TPool>();
// return self; return self;
// } }
// public static EcsAspect.Builder Opt<TPool>(this EcsAspect.Builder self, ref TPool pool) where TPool : IEcsPoolImplementation, new() public static EcsAspect.Builder Opt<TPool>(this EcsAspect.Builder self, ref TPool pool) where TPool : IEcsPoolImplementation, new()
// { {
// pool = self.OptionalPool<TPool>(); pool = self.OptionalPool<TPool>();
// return self; return self;
// } }
//} }
#endregion #endregion
#region Constraint Markers #region Constraint Markers

View File

@ -374,40 +374,38 @@ namespace DCFApixels.DragonECS
{ {
#if (DEBUG && !DISABLE_DEBUG) || ENABLE_DRAGONECS_ASSERT_CHEKS #if (DEBUG && !DISABLE_DEBUG) || ENABLE_DRAGONECS_ASSERT_CHEKS
ref var slot = ref _poolSlots[componentTypeID]; ref var slot = ref _poolSlots[componentTypeID];
if (slot.locked == false) if (slot.lockedCounter == 0)
{ {
slot.locked = true; //очистка буффера, чтобы она рандомно не сработала в блоке блоикровки пула
if (_lockedPoolCount == 0) ReleaseDelEntityBufferAll();
{
ReleaseDelEntityBufferAll();
}
_lockedPoolCount++; _lockedPoolCount++;
_pools[componentTypeID].OnLockedChanged_Debug(true);
} }
slot.lockedCounter++;
_pools[componentTypeID].OnLockedChanged_Debug(true);
#endif #endif
} }
public void UnlockPool_Debug(int componentTypeID) public void UnlockPool_Debug(int componentTypeID)
{ {
#if (DEBUG && !DISABLE_DEBUG) || ENABLE_DRAGONECS_ASSERT_CHEKS #if (DEBUG && !DISABLE_DEBUG) || ENABLE_DRAGONECS_ASSERT_CHEKS
ref var slot = ref _poolSlots[componentTypeID]; ref var slot = ref _poolSlots[componentTypeID];
if (slot.locked == true) slot.lockedCounter--;
if (slot.lockedCounter <= 0)
{ {
slot.locked = false;
_lockedPoolCount--; _lockedPoolCount--;
if (_lockedPoolCount < 0 || slot.lockedCounter < 0)
if (_lockedPoolCount < 0)
{ {
_lockedPoolCount = 0; _lockedPoolCount = 0;
slot.lockedCounter = 0;
Throw.OpeningClosingMethodsBalanceError(); Throw.OpeningClosingMethodsBalanceError();
} }
_pools[componentTypeID].OnLockedChanged_Debug(false);
} }
_pools[componentTypeID].OnLockedChanged_Debug(false);
#endif #endif
} }
public bool CheckPoolLocked_Debug(int componentTypeID) public bool CheckPoolLocked_Debug(int componentTypeID)
{ {
#if (DEBUG && !DISABLE_DEBUG) || ENABLE_DRAGONECS_ASSERT_CHEKS #if (DEBUG && !DISABLE_DEBUG) || ENABLE_DRAGONECS_ASSERT_CHEKS
return _poolSlots[componentTypeID].locked; return _poolSlots[componentTypeID].lockedCounter != 0;
#else #else
return false; return false;
#endif #endif
@ -417,10 +415,10 @@ namespace DCFApixels.DragonECS
#region Utils #region Utils
internal struct PoolSlot internal struct PoolSlot
{ {
public int count;
public long version; public long version;
public int count;
#if (DEBUG && !DISABLE_DEBUG) || ENABLE_DRAGONECS_ASSERT_CHEKS #if (DEBUG && !DISABLE_DEBUG) || ENABLE_DRAGONECS_ASSERT_CHEKS
public bool locked; public int lockedCounter;
#endif #endif
} }
public readonly ref struct GetPoolInstanceMarker public readonly ref struct GetPoolInstanceMarker

View File

@ -3,6 +3,7 @@ using DCFApixels.DragonECS.PoolsCore;
using System; using System;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics; using System.Diagnostics;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
#if ENABLE_IL2CPP #if ENABLE_IL2CPP
@ -46,7 +47,7 @@ namespace DCFApixels.DragonECS
private bool _isHasComponentCopyHandler = EcsComponentCopyHandler<T>.isHasHandler; private bool _isHasComponentCopyHandler = EcsComponentCopyHandler<T>.isHasHandler;
#if !DISABLE_POOLS_EVENTS #if !DISABLE_POOLS_EVENTS
private readonly List<IEcsPoolEventListener> _listeners = new List<IEcsPoolEventListener>(); private readonly StructList<IEcsPoolEventListener> _listeners = new StructList<IEcsPoolEventListener>(2);
private int _listenersCachedCount = 0; private int _listenersCachedCount = 0;
#endif #endif
private bool _isLocked; private bool _isLocked;
@ -102,11 +103,12 @@ namespace DCFApixels.DragonECS
} }
} }
_mediator.RegisterComponent(entityID, _componentTypeID, _maskBit); _mediator.RegisterComponent(entityID, _componentTypeID, _maskBit);
EnableComponent(ref _items[itemIndex]); ref T result = ref _items[itemIndex];
EnableComponent(ref result);
#if !DISABLE_POOLS_EVENTS #if !DISABLE_POOLS_EVENTS
_listeners.InvokeOnAddAndGet(entityID, _listenersCachedCount); _listeners.InvokeOnAddAndGet(entityID, _listenersCachedCount);
#endif #endif
return ref _items[itemIndex]; return ref result;
} }
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public ref T Get(int entityID) public ref T Get(int entityID)
@ -284,7 +286,7 @@ namespace DCFApixels.DragonECS
public void RemoveListener(IEcsPoolEventListener listener) public void RemoveListener(IEcsPoolEventListener listener)
{ {
if (listener == null) { EcsPoolThrowHelper.ThrowNullListener(); } if (listener == null) { EcsPoolThrowHelper.ThrowNullListener(); }
if (_listeners.Remove(listener)) if (_listeners.RemoveWithOrder(listener))
{ {
_listenersCachedCount--; _listenersCachedCount--;
} }
@ -343,7 +345,8 @@ namespace DCFApixels.DragonECS
public static implicit operator EcsPool<T>(EcsWorld.GetPoolInstanceMarker a) { return a.GetInstance<EcsPool<T>>(); } public static implicit operator EcsPool<T>(EcsWorld.GetPoolInstanceMarker a) { return a.GetInstance<EcsPool<T>>(); }
#endregion #endregion
} }
public static class EcsPoolExt
public static class EcsPoolExtensions
{ {
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static EcsPool<TComponent> GetPool<TComponent>(this EcsWorld self) where TComponent : struct, IEcsComponent public static EcsPool<TComponent> GetPool<TComponent>(this EcsWorld self) where TComponent : struct, IEcsComponent
@ -356,20 +359,44 @@ namespace DCFApixels.DragonECS
return self.GetPoolInstanceUnchecked<EcsPool<TComponent>>(); return self.GetPoolInstanceUnchecked<EcsPool<TComponent>>();
} }
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static EcsPool<TComponent> Inc<TComponent>(this EcsAspect.Builder self) where TComponent : struct, IEcsComponent
{
return self.IncludePool<EcsPool<TComponent>>();
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static EcsPool<TComponent> Exc<TComponent>(this EcsAspect.Builder self) where TComponent : struct, IEcsComponent
{
return self.ExcludePool<EcsPool<TComponent>>();
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static EcsPool<TComponent> Opt<TComponent>(this EcsAspect.Builder self) where TComponent : struct, IEcsComponent
{
return self.OptionalPool<EcsPool<TComponent>>();
}
#region Obsolete
[Obsolete("Use " + nameof(EcsAspect) + "." + nameof(EcsAspect.Builder) + "." + nameof(Inc) + "<T>()")]
[EditorBrowsable(EditorBrowsableState.Never)]
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static EcsPool<TComponent> Include<TComponent>(this EcsAspect.Builder self) where TComponent : struct, IEcsComponent public static EcsPool<TComponent> Include<TComponent>(this EcsAspect.Builder self) where TComponent : struct, IEcsComponent
{ {
return self.IncludePool<EcsPool<TComponent>>(); return self.IncludePool<EcsPool<TComponent>>();
} }
[Obsolete("Use " + nameof(EcsAspect) + "." + nameof(EcsAspect.Builder) + "." + nameof(Exc) + "<T>()")]
[EditorBrowsable(EditorBrowsableState.Never)]
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static EcsPool<TComponent> Exclude<TComponent>(this EcsAspect.Builder self) where TComponent : struct, IEcsComponent public static EcsPool<TComponent> Exclude<TComponent>(this EcsAspect.Builder self) where TComponent : struct, IEcsComponent
{ {
return self.ExcludePool<EcsPool<TComponent>>(); return self.ExcludePool<EcsPool<TComponent>>();
} }
[Obsolete("Use " + nameof(EcsAspect) + "." + nameof(EcsAspect.Builder) + "." + nameof(Opt) + "<T>()")]
[EditorBrowsable(EditorBrowsableState.Never)]
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static EcsPool<TComponent> Optional<TComponent>(this EcsAspect.Builder self) where TComponent : struct, IEcsComponent public static EcsPool<TComponent> Optional<TComponent>(this EcsAspect.Builder self) where TComponent : struct, IEcsComponent
{ {
return self.OptionalPool<EcsPool<TComponent>>(); return self.OptionalPool<EcsPool<TComponent>>();
} }
#endregion
} }
} }

View File

@ -295,6 +295,34 @@ namespace DCFApixels.DragonECS
{ {
for (int i = 0; i < cachedCount; i++) self[i].OnDel(entityID); for (int i = 0; i < cachedCount; i++) self[i].OnDel(entityID);
} }
//
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal static void InvokeOnAdd(this StructList<IEcsPoolEventListener> self, int entityID, int cachedCount)
{
for (int i = 0; i < cachedCount; i++) self[i].OnAdd(entityID);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal static void InvokeOnAddAndGet(this StructList<IEcsPoolEventListener> self, int entityID, int cachedCount)
{
for (int i = 0; i < cachedCount; i++)
{
self[i].OnAdd(entityID);
self[i].OnGet(entityID);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal static void InvokeOnGet(this StructList<IEcsPoolEventListener> self, int entityID, int cachedCount)
{
for (int i = 1; i < cachedCount; i++) self[i].OnGet(entityID);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal static void InvokeOnDel(this StructList<IEcsPoolEventListener> self, int entityID, int cachedCount)
{
for (int i = 0; i < cachedCount; i++) self[i].OnDel(entityID);
}
} }
#endif #endif
#endregion #endregion

View File

@ -4,7 +4,8 @@ using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using System.Diagnostics; using System.Diagnostics;
using DCFApixels.DragonECS.Internal;
using System.ComponentModel;
#if (DEBUG && !DISABLE_DEBUG) #if (DEBUG && !DISABLE_DEBUG)
using System.Reflection; using System.Reflection;
#endif #endif
@ -41,7 +42,7 @@ namespace DCFApixels.DragonECS
private int _count = 0; private int _count = 0;
#if !DISABLE_POOLS_EVENTS #if !DISABLE_POOLS_EVENTS
private List<IEcsPoolEventListener> _listeners = new List<IEcsPoolEventListener>(); private StructList<IEcsPoolEventListener> _listeners = new StructList<IEcsPoolEventListener>(2);
private int _listenersCachedCount = 0; private int _listenersCachedCount = 0;
#endif #endif
private bool _isLocked; private bool _isLocked;
@ -274,7 +275,7 @@ namespace DCFApixels.DragonECS
public void RemoveListener(IEcsPoolEventListener listener) public void RemoveListener(IEcsPoolEventListener listener)
{ {
if (listener == null) { EcsPoolThrowHelper.ThrowNullListener(); } if (listener == null) { EcsPoolThrowHelper.ThrowNullListener(); }
if (_listeners.Remove(listener)) if (_listeners.RemoveWithOrder(listener))
{ {
_listenersCachedCount--; _listenersCachedCount--;
} }
@ -294,7 +295,8 @@ namespace DCFApixels.DragonECS
public static implicit operator EcsTagPool<T>(EcsWorld.GetPoolInstanceMarker a) { return a.GetInstance<EcsTagPool<T>>(); } public static implicit operator EcsTagPool<T>(EcsWorld.GetPoolInstanceMarker a) { return a.GetInstance<EcsTagPool<T>>(); }
#endregion #endregion
} }
public static class EcsTagPoolExt
public static class EcsTagPoolExtensions
{ {
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static EcsTagPool<TTagComponent> GetPool<TTagComponent>(this EcsWorld self) where TTagComponent : struct, IEcsTagComponent public static EcsTagPool<TTagComponent> GetPool<TTagComponent>(this EcsWorld self) where TTagComponent : struct, IEcsTagComponent
@ -307,16 +309,39 @@ namespace DCFApixels.DragonECS
return self.GetPoolInstanceUnchecked<EcsTagPool<TTagComponent>>(); return self.GetPoolInstanceUnchecked<EcsTagPool<TTagComponent>>();
} }
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static EcsTagPool<TTagComponent> Inc<TTagComponent>(this EcsAspect.Builder self) where TTagComponent : struct, IEcsTagComponent
{
return self.IncludePool<EcsTagPool<TTagComponent>>();
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static EcsTagPool<TTagComponent> Exc<TTagComponent>(this EcsAspect.Builder self) where TTagComponent : struct, IEcsTagComponent
{
return self.ExcludePool<EcsTagPool<TTagComponent>>();
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static EcsTagPool<TTagComponent> Opt<TTagComponent>(this EcsAspect.Builder self) where TTagComponent : struct, IEcsTagComponent
{
return self.OptionalPool<EcsTagPool<TTagComponent>>();
}
#region Obsolete
[Obsolete("Use " + nameof(EcsAspect) + "." + nameof(EcsAspect.Builder) + "." + nameof(Inc) + "<T>()")]
[EditorBrowsable(EditorBrowsableState.Never)]
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static EcsTagPool<TTagComponent> Include<TTagComponent>(this EcsAspect.Builder self) where TTagComponent : struct, IEcsTagComponent public static EcsTagPool<TTagComponent> Include<TTagComponent>(this EcsAspect.Builder self) where TTagComponent : struct, IEcsTagComponent
{ {
return self.IncludePool<EcsTagPool<TTagComponent>>(); return self.IncludePool<EcsTagPool<TTagComponent>>();
} }
[Obsolete("Use " + nameof(EcsAspect) + "." + nameof(EcsAspect.Builder) + "." + nameof(Exc) + "<T>()")]
[EditorBrowsable(EditorBrowsableState.Never)]
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static EcsTagPool<TTagComponent> Exclude<TTagComponent>(this EcsAspect.Builder self) where TTagComponent : struct, IEcsTagComponent public static EcsTagPool<TTagComponent> Exclude<TTagComponent>(this EcsAspect.Builder self) where TTagComponent : struct, IEcsTagComponent
{ {
return self.ExcludePool<EcsTagPool<TTagComponent>>(); return self.ExcludePool<EcsTagPool<TTagComponent>>();
} }
[Obsolete("Use " + nameof(EcsAspect) + "." + nameof(EcsAspect.Builder) + "." + nameof(Opt) + "<T>()")]
[EditorBrowsable(EditorBrowsableState.Never)]
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static EcsTagPool<TTagComponent> Optional<TTagComponent>(this EcsAspect.Builder self) where TTagComponent : struct, IEcsTagComponent public static EcsTagPool<TTagComponent> Optional<TTagComponent>(this EcsAspect.Builder self) where TTagComponent : struct, IEcsTagComponent
{ {
@ -325,31 +350,42 @@ namespace DCFApixels.DragonECS
//--------------------------------------------------- //---------------------------------------------------
[Obsolete("Use " + nameof(EcsAspect) + "." + nameof(EcsAspect.Builder) + "." + nameof(GetPool) + "<T>()")]
[EditorBrowsable(EditorBrowsableState.Never)]
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static EcsTagPool<TTagComponent> GetTagPool<TTagComponent>(this EcsWorld self) where TTagComponent : struct, IEcsTagComponent public static EcsTagPool<TTagComponent> GetTagPool<TTagComponent>(this EcsWorld self) where TTagComponent : struct, IEcsTagComponent
{ {
return self.GetPoolInstance<EcsTagPool<TTagComponent>>(); return self.GetPoolInstance<EcsTagPool<TTagComponent>>();
} }
[Obsolete("Use " + nameof(EcsAspect) + "." + nameof(EcsAspect.Builder) + "." + nameof(GetPoolUnchecked) + "<T>()")]
[EditorBrowsable(EditorBrowsableState.Never)]
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static EcsTagPool<TTagComponent> GetTagPoolUnchecked<TTagComponent>(this EcsWorld self) where TTagComponent : struct, IEcsTagComponent public static EcsTagPool<TTagComponent> GetTagPoolUnchecked<TTagComponent>(this EcsWorld self) where TTagComponent : struct, IEcsTagComponent
{ {
return self.GetPoolInstanceUnchecked<EcsTagPool<TTagComponent>>(); return self.GetPoolInstanceUnchecked<EcsTagPool<TTagComponent>>();
} }
[Obsolete("Use " + nameof(EcsAspect) + "." + nameof(EcsAspect.Builder) + "." + nameof(Inc) + "<T>()")]
[EditorBrowsable(EditorBrowsableState.Never)]
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static EcsTagPool<TTagComponent> IncludeTag<TTagComponent>(this EcsAspect.Builder self) where TTagComponent : struct, IEcsTagComponent public static EcsTagPool<TTagComponent> IncludeTag<TTagComponent>(this EcsAspect.Builder self) where TTagComponent : struct, IEcsTagComponent
{ {
return self.IncludePool<EcsTagPool<TTagComponent>>(); return self.IncludePool<EcsTagPool<TTagComponent>>();
} }
[Obsolete("Use " + nameof(EcsAspect) + "." + nameof(EcsAspect.Builder) + "." + nameof(Exc) + "<T>()")]
[EditorBrowsable(EditorBrowsableState.Never)]
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static EcsTagPool<TTagComponent> ExcludeTag<TTagComponent>(this EcsAspect.Builder self) where TTagComponent : struct, IEcsTagComponent public static EcsTagPool<TTagComponent> ExcludeTag<TTagComponent>(this EcsAspect.Builder self) where TTagComponent : struct, IEcsTagComponent
{ {
return self.ExcludePool<EcsTagPool<TTagComponent>>(); return self.ExcludePool<EcsTagPool<TTagComponent>>();
} }
[Obsolete("Use " + nameof(EcsAspect) + "." + nameof(EcsAspect.Builder) + "." + nameof(Opt) + "<T>()")]
[EditorBrowsable(EditorBrowsableState.Never)]
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static EcsTagPool<TTagComponent> OptionalTag<TTagComponent>(this EcsAspect.Builder self) where TTagComponent : struct, IEcsTagComponent public static EcsTagPool<TTagComponent> OptionalTag<TTagComponent>(this EcsAspect.Builder self) where TTagComponent : struct, IEcsTagComponent
{ {
return self.OptionalPool<EcsTagPool<TTagComponent>>(); return self.OptionalPool<EcsTagPool<TTagComponent>>();
} }
#endregion
} }
} }