From 16b273d5e40601f4e992d535a3a90e0ae225925e Mon Sep 17 00:00:00 2001 From: Mikhail <99481254+DCFApixels@users.noreply.github.com> Date: Sun, 31 Dec 2023 22:41:48 +0800 Subject: [PATCH] Update DelEntBuffer --- src/EcsWorld.cs | 85 ++++++++++++++++++++++++++++++++----------------- 1 file changed, 55 insertions(+), 30 deletions(-) diff --git a/src/EcsWorld.cs b/src/EcsWorld.cs index 3dc275d..a071784 100644 --- a/src/EcsWorld.cs +++ b/src/EcsWorld.cs @@ -23,7 +23,7 @@ namespace DCFApixels.DragonECS private int _delEntBufferCount; private int _delEntBufferMinCount; private int _freeSpace; - //private bool _isEnableReleaseDelEntBuffer = true; + private bool _isEnableReleaseDelEntBuffer = true; private List> _groups = new List>(); private Stack _groupsPool = new Stack(64); @@ -41,6 +41,7 @@ namespace DCFApixels.DragonECS public int Capacity => _entitesCapacity; //_denseEntities.Length; public int DelEntBufferCount => _delEntBufferCount; + public bool IsEnableReleaseDelEntBuffer => _isEnableReleaseDelEntBuffer; public EcsReadonlyGroup Entities => _allEntites.Readonly; public ReadOnlySpan AllPools => _pools;// new ReadOnlySpan(pools, 0, _poolsCount); @@ -136,51 +137,75 @@ namespace DCFApixels.DragonECS #region Where Query public EcsReadonlyGroup WhereToGroupFor(EcsSpan span, out TAspect aspect) where TAspect : EcsAspect { - ReleaseDelEntityBufferAll(); + if(_isEnableReleaseDelEntBuffer) + { + ReleaseDelEntityBufferAll(); + } var executor = GetExecutor>(); aspect = executor.Aspect; return executor.ExecuteFor(span); } public EcsReadonlyGroup WhereToGroupFor(EcsSpan span) where TAspect : EcsAspect { - ReleaseDelEntityBufferAll(); + if (_isEnableReleaseDelEntBuffer) + { + ReleaseDelEntityBufferAll(); + } return GetExecutor>().ExecuteFor(span); } public EcsReadonlyGroup WhereToGroup(out TAspect aspect) where TAspect : EcsAspect { - ReleaseDelEntityBufferAll(); + if (_isEnableReleaseDelEntBuffer) + { + ReleaseDelEntityBufferAll(); + } var executor = GetExecutor>(); aspect = executor.Aspect; return executor.Execute(); } public EcsReadonlyGroup WhereToGroup() where TAspect : EcsAspect { - ReleaseDelEntityBufferAll(); + if (_isEnableReleaseDelEntBuffer) + { + ReleaseDelEntityBufferAll(); + } return GetExecutor>().Execute(); } public EcsSpan WhereFor(EcsSpan span, out TAspect aspect) where TAspect : EcsAspect { - ReleaseDelEntityBufferAll(); + if (_isEnableReleaseDelEntBuffer) + { + ReleaseDelEntityBufferAll(); + } var executor = GetExecutor>(); aspect = executor.Aspect; return executor.ExecuteFor(span); } public EcsSpan WhereFor(EcsSpan span) where TAspect : EcsAspect { - ReleaseDelEntityBufferAll(); + if (_isEnableReleaseDelEntBuffer) + { + ReleaseDelEntityBufferAll(); + } return GetExecutor>().ExecuteFor(span); } public EcsSpan Where(out TAspect aspect) where TAspect : EcsAspect { - ReleaseDelEntityBufferAll(); + if (_isEnableReleaseDelEntBuffer) + { + ReleaseDelEntityBufferAll(); + } var executor = GetExecutor>(); aspect = executor.Aspect; return executor.Execute(); } public EcsSpan Where() where TAspect : EcsAspect { - ReleaseDelEntityBufferAll(); + if (_isEnableReleaseDelEntBuffer) + { + ReleaseDelEntityBufferAll(); + } return GetExecutor>().Execute(); } #endregion @@ -333,27 +358,27 @@ namespace DCFApixels.DragonECS #endregion #region DelEntBuffer - //public AutoReleaseDelEntBufferLonkUnloker DisableAutoReleaseDelEntBuffer() - //{ - // _isEnableReleaseDelEntBuffer = false; - // return new AutoReleaseDelEntBufferLonkUnloker(this); - //} - //public void EnableAutoReleaseDelEntBuffer() - //{ - // _isEnableReleaseDelEntBuffer = true; - //} - //public readonly struct AutoReleaseDelEntBufferLonkUnloker : IDisposable - //{ - // private readonly EcsWorld _source; - // public AutoReleaseDelEntBufferLonkUnloker(EcsWorld source) - // { - // _source = source; - // } - // public void Dispose() - // { - // _source.EnableAutoReleaseDelEntBuffer(); - // } - //} + public AutoReleaseDelEntBufferLonkUnloker DisableAutoReleaseDelEntBuffer() + { + _isEnableReleaseDelEntBuffer = false; + return new AutoReleaseDelEntBufferLonkUnloker(this); + } + public void EnableAutoReleaseDelEntBuffer() + { + _isEnableReleaseDelEntBuffer = true; + } + public readonly struct AutoReleaseDelEntBufferLonkUnloker : IDisposable + { + private readonly EcsWorld _source; + public AutoReleaseDelEntBufferLonkUnloker(EcsWorld source) + { + _source = source; + } + public void Dispose() + { + _source.EnableAutoReleaseDelEntBuffer(); + } + } public void ReleaseDelEntityBufferAll() { ReleaseDelEntityBuffer(-1);