diff --git a/src/Collections/EcsGroup.cs b/src/Collections/EcsGroup.cs index f56b442..9624a10 100644 --- a/src/Collections/EcsGroup.cs +++ b/src/Collections/EcsGroup.cs @@ -853,7 +853,25 @@ namespace DCFApixels.DragonECS [MethodImpl(MethodImplOptions.AggressiveInlining)] public int Last() { return _dense[_count]; } [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal void OnWorldResize(int newSize) { Array.Resize(ref _sparse, newSize); } + internal void OnWorldResize_Internal(int newSize) + { + Array.Resize(ref _sparse, newSize); + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal void OnReleaseDelEntityBuffer_Internal(ReadOnlySpan buffer) + { + if (_count <= 0) + { + return; + } + foreach (var entityID in buffer) + { + if (Has(entityID)) + { + Remove_Internal(entityID); + } + } + } public override string ToString() { return CollectionUtility.EntitiesToString(_dense.Skip(1).Take(_count), "group"); diff --git a/src/EcsWorld.cs b/src/EcsWorld.cs index dc825ca..487844b 100644 --- a/src/EcsWorld.cs +++ b/src/EcsWorld.cs @@ -462,8 +462,7 @@ namespace DCFApixels.DragonECS return; } unchecked { _version++; } - count = Math.Min(count, _delEntBufferCount); - count = Math.Max(count, 0); + count = Math.Max(0, Math.Min(count, _delEntBufferCount)); _delEntBufferCount -= count; int slisedCount = count; @@ -488,6 +487,17 @@ namespace DCFApixels.DragonECS _pools[i].OnReleaseDelEntityBuffer(bufferSlised); } } + for (int i = 0; i < _groups.Count; i++) + { + if (_groups[i].TryGetTarget(out EcsGroup group) && group.IsReleased) + { + group.OnReleaseDelEntityBuffer_Internal(buffer); + } + else + { + RemoveGroupAt(i--); + } + } _listeners.InvokeOnReleaseDelEntityBuffer(buffer); for (int i = 0; i < buffer.Length; i++) @@ -525,25 +535,28 @@ namespace DCFApixels.DragonECS { if (_groups[i].TryGetTarget(out EcsGroup group)) { - group.OnWorldResize(newSize); + group.OnWorldResize_Internal(newSize); } else { - int last = _groups.Count - 1; - _groups[i--] = _groups[last]; - _groups.RemoveAt(last); + RemoveGroupAt(i--); } } foreach (var item in _pools) { item.OnWorldResize(newSize); } - _listeners.InvokeOnWorldResize(newSize); } #endregion #region Groups Pool + private void RemoveGroupAt(int index) + { + int last = _groups.Count - 1; + _groups[index] = _groups[last]; + _groups.RemoveAt(last); + } internal void RegisterGroup(EcsGroup group) { _groups.Add(new WeakReference(group));