diff --git a/Engine.Core/Collectors/ActiveBehaviourCollectorOrdered.cs b/Engine.Core/Collectors/ActiveBehaviourCollectorOrdered.cs index 502e45c..927d009 100644 --- a/Engine.Core/Collectors/ActiveBehaviourCollectorOrdered.cs +++ b/Engine.Core/Collectors/ActiveBehaviourCollectorOrdered.cs @@ -5,9 +5,8 @@ namespace Engine.Core; public class ActiveBehaviourCollectorOrdered : ActiveBehaviourCollector where TItem : class, IBehaviour where TIndex : IComparable { - private readonly Event.EventHandler delegateOnPriorityChanged = null!; - private readonly SortedDictionary> behaviours = null!; + private readonly Dictionary indexCache = []; private readonly Func getIndexFunc = null!; private readonly IComparer sortBy = null!; @@ -39,11 +38,10 @@ public class ActiveBehaviourCollectorOrdered : ActiveBehaviourCol protected override bool RemoveBehaviour(TItem tBehaviour) { - TIndex index = getIndexFunc(tBehaviour); - if (!behaviours.TryGetValue(index, out FastList? list)) + if (!indexCache.TryGetValue(tBehaviour, out TIndex? index) || !behaviours.TryGetValue(index, out FastList? list)) throw new Exceptions.NotFoundException($"Index of '{index}' is not found in the collector"); - if (!list.Remove(tBehaviour)) + if (!list.Remove(tBehaviour) || !indexCache.Remove(tBehaviour)) return false; count--; @@ -58,21 +56,11 @@ public class ActiveBehaviourCollectorOrdered : ActiveBehaviourCol count++; list.Add(behaviour); - } - - protected override void OnBehaviourAdd(IBehaviour behaviour) => behaviour.OnPriorityChanged.AddListener(delegateOnPriorityChanged); - protected override void OnBehaviourRemove(IBehaviour behaviour) => behaviour.OnPriorityChanged.RemoveListener(delegateOnPriorityChanged); - - private void OnPriorityChanged(IBehaviour sender, IBehaviour.PriorityChangedArguments args) - { - TItem behaviour = (TItem)sender; - RemoveBehaviour(behaviour); - AddBehaviour(behaviour); + indexCache.Add(behaviour, key); } public ActiveBehaviourCollectorOrdered(Func getIndexFunc, Comparison sortBy) { - delegateOnPriorityChanged = OnPriorityChanged; this.getIndexFunc = getIndexFunc; this.sortBy = Comparer.Create(sortBy); behaviours = new(this.sortBy); @@ -80,7 +68,6 @@ public class ActiveBehaviourCollectorOrdered : ActiveBehaviourCol public ActiveBehaviourCollectorOrdered(IUniverse universe, Func getIndexFunc, Comparison sortBy) : base(universe) { - delegateOnPriorityChanged = OnPriorityChanged; this.getIndexFunc = getIndexFunc; this.sortBy = Comparer.Create(sortBy); behaviours = new(this.sortBy); @@ -89,14 +76,12 @@ public class ActiveBehaviourCollectorOrdered : ActiveBehaviourCol public ActiveBehaviourCollectorOrdered(Func getIndexFunc, IComparer sortBy) { this.getIndexFunc = getIndexFunc; - delegateOnPriorityChanged = OnPriorityChanged; this.sortBy = sortBy; behaviours = new(sortBy); } public ActiveBehaviourCollectorOrdered(IUniverse universe, Func getIndexFunc, IComparer sortBy) : base(universe) { - delegateOnPriorityChanged = OnPriorityChanged; this.getIndexFunc = getIndexFunc; this.sortBy = sortBy; behaviours = new(sortBy); diff --git a/Engine.Core/Collectors/BehaviourCollectorOrdered.cs b/Engine.Core/Collectors/BehaviourCollectorOrdered.cs index 6f1077a..4fe27ff 100644 --- a/Engine.Core/Collectors/BehaviourCollectorOrdered.cs +++ b/Engine.Core/Collectors/BehaviourCollectorOrdered.cs @@ -5,9 +5,8 @@ namespace Engine.Core; public class BehaviourCollectorOrdered : BehaviourCollectorBase where TItem : class where TIndex : IComparable { - private readonly Event.EventHandler delegateOnPriorityChanged = null!; - private readonly SortedDictionary> behaviours = null!; + private readonly Dictionary indexCache = null!; private readonly Func getIndexFunc = null!; private readonly IComparer sortBy = null!; @@ -39,11 +38,10 @@ public class BehaviourCollectorOrdered : BehaviourCollectorBase? list)) + if (!indexCache.TryGetValue(tBehaviour, out TIndex? index) || !behaviours.TryGetValue(index, out FastList? list)) throw new Exceptions.NotFoundException($"Index of '{index}' is not found in the collector"); - if (!list.Remove(tBehaviour)) + if (!list.Remove(tBehaviour) || !indexCache.Remove(tBehaviour)) return false; count--; @@ -58,21 +56,11 @@ public class BehaviourCollectorOrdered : BehaviourCollectorBase behaviour.OnPriorityChanged.AddListener(delegateOnPriorityChanged); - protected override void OnBehaviourRemove(IBehaviour behaviour) => behaviour.OnPriorityChanged.RemoveListener(delegateOnPriorityChanged); - - private void OnPriorityChanged(IBehaviour sender, IBehaviour.PriorityChangedArguments args) - { - TItem behaviour = (TItem)sender; - RemoveBehaviour(behaviour); - AddBehaviour(behaviour); + indexCache.Add(behaviour, key); } public BehaviourCollectorOrdered(Func getIndexFunc, Comparison sortBy) { - delegateOnPriorityChanged = OnPriorityChanged; this.getIndexFunc = getIndexFunc; this.sortBy = Comparer.Create(sortBy); behaviours = new(this.sortBy); @@ -80,7 +68,6 @@ public class BehaviourCollectorOrdered : BehaviourCollectorBase getIndexFunc, Comparison sortBy) : base(universe) { - delegateOnPriorityChanged = OnPriorityChanged; this.getIndexFunc = getIndexFunc; this.sortBy = Comparer.Create(sortBy); behaviours = new(this.sortBy); @@ -89,14 +76,12 @@ public class BehaviourCollectorOrdered : BehaviourCollectorBase getIndexFunc, IComparer sortBy) { this.getIndexFunc = getIndexFunc; - delegateOnPriorityChanged = OnPriorityChanged; this.sortBy = sortBy; behaviours = new(sortBy); } public BehaviourCollectorOrdered(IUniverse universe, Func getIndexFunc, IComparer sortBy) : base(universe) { - delegateOnPriorityChanged = OnPriorityChanged; this.getIndexFunc = getIndexFunc; this.sortBy = sortBy; behaviours = new(sortBy);