From 79452349c2e97eb2844d28f9140591975b4da942 Mon Sep 17 00:00:00 2001 From: Mikhail <99481254+DCFApixels@users.noreply.github.com> Date: Fri, 9 Feb 2024 22:20:55 +0800 Subject: [PATCH] update data interfaces --- src/DataInterfaces.cs | 6 ++++++ src/Pools/EcsPool.cs | 41 ++++++++++++++++++++++++++++++++++++----- 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/src/DataInterfaces.cs b/src/DataInterfaces.cs index d200d3a..81a8a70 100644 --- a/src/DataInterfaces.cs +++ b/src/DataInterfaces.cs @@ -17,10 +17,12 @@ namespace DCFApixels.DragonECS T def = default; if (def is IEcsWorldComponent intrf) { + isHasHandler = true; instance = intrf; } else { + isHasHandler = false; instance = new DummyHandler(); } } @@ -47,10 +49,12 @@ namespace DCFApixels.DragonECS T def = default; if (def is IEcsComponentReset intrf) { + isHasHandler = true; instance = intrf; } else { + isHasHandler = false; instance = new DummyHandler(); } } @@ -76,10 +80,12 @@ namespace DCFApixels.DragonECS T def = default; if (def is IEcsComponentCopy intrf) { + isHasHandler = true; instance = intrf; } else { + isHasHandler = false; instance = new DummyHandler(); } } diff --git a/src/Pools/EcsPool.cs b/src/Pools/EcsPool.cs index 0110348..cc69c74 100644 --- a/src/Pools/EcsPool.cs +++ b/src/Pools/EcsPool.cs @@ -21,7 +21,9 @@ namespace DCFApixels.DragonECS private int _recycledItemsCount; private IEcsComponentReset _componentResetHandler = EcsComponentResetHandler.instance; + private bool _isHasComponentResetHandler = EcsComponentResetHandler.isHasHandler; private IEcsComponentCopy _componentCopyHandler = EcsComponentCopyHandler.instance; + private bool _isHasComponentCopyHandler = EcsComponentCopyHandler.isHasHandler; private List _listeners = new List(); @@ -55,7 +57,7 @@ namespace DCFApixels.DragonECS } _mediator.RegisterComponent(entityID, _componentTypeID, _maskBit); _listeners.InvokeOnAddAndGet(entityID); - _componentResetHandler.Reset(ref _items[itemIndex]); + ResetComponent(ref _items[itemIndex]); return ref _items[itemIndex]; } [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -95,7 +97,7 @@ namespace DCFApixels.DragonECS _listeners.InvokeOnAdd(entityID); } _listeners.InvokeOnGet(entityID); - _componentResetHandler.Reset(ref _items[itemIndex]); + ResetComponent(ref _items[itemIndex]); return ref _items[itemIndex]; } [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -109,9 +111,11 @@ namespace DCFApixels.DragonECS if (!Has(entityID)) EcsPoolThrowHalper.ThrowNotHaveComponent(entityID); #endif ref int itemIndex = ref _mapping[entityID]; - _componentResetHandler.Reset(ref _items[itemIndex]); + ResetComponent(ref _items[itemIndex]); if (_recycledItemsCount >= _recycledItems.Length) + { Array.Resize(ref _recycledItems, _recycledItems.Length << 1); + } _recycledItems[_recycledItemsCount++] = itemIndex; _mapping[entityID] = 0; _itemsCount--; @@ -127,14 +131,14 @@ namespace DCFApixels.DragonECS #if (DEBUG && !DISABLE_DEBUG) || ENABLE_DRAGONECS_ASSERT_CHEKS if (!Has(fromEntityID)) EcsPoolThrowHalper.ThrowNotHaveComponent(fromEntityID); #endif - _componentCopyHandler.Copy(ref Get(fromEntityID), ref TryAddOrGet(toEntityID)); + CopyComponent(ref Get(fromEntityID), ref TryAddOrGet(toEntityID)); } public void Copy(int fromEntityID, EcsWorld toWorld, int toEntityID) { #if (DEBUG && !DISABLE_DEBUG) || ENABLE_DRAGONECS_ASSERT_CHEKS if (!Has(fromEntityID)) EcsPoolThrowHalper.ThrowNotHaveComponent(fromEntityID); #endif - _componentCopyHandler.Copy(ref Get(fromEntityID), ref toWorld.GetPool().TryAddOrGet(toEntityID)); + CopyComponent(ref Get(fromEntityID), ref toWorld.GetPool().TryAddOrGet(toEntityID)); } #endregion @@ -187,6 +191,33 @@ namespace DCFApixels.DragonECS } #endregion + #region Reset/Copy + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private void ResetComponent(ref T component) + { + if (_isHasComponentResetHandler) + { + _componentResetHandler.Reset(ref component); + } + else + { + component = default; + } + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private void CopyComponent(ref T from, ref T to) + { + if (_isHasComponentCopyHandler) + { + _componentCopyHandler.Copy(ref from, ref to); + } + else + { + to = from; + } + } + #endregion + #region IEnumerator - IntelliSense hack IEnumerator IEnumerable.GetEnumerator() => throw new NotImplementedException(); IEnumerator IEnumerable.GetEnumerator() => throw new NotImplementedException();