Development Merge 2025.10.18 #4
@@ -16,8 +16,8 @@ public class ActiveBehaviourCollector<T> : IBehaviourCollector<T> where T : clas
 | 
				
			|||||||
    private readonly Event<IUniverse, IUniverse.UniverseObjectRegisteredArguments>.EventHandler delegateOnUniverseObjectRegistered = null!;
 | 
					    private readonly Event<IUniverse, IUniverse.UniverseObjectRegisteredArguments>.EventHandler delegateOnUniverseObjectRegistered = null!;
 | 
				
			||||||
    private readonly Event<IUniverse, IUniverse.UniverseObjectUnRegisteredArguments>.EventHandler delegateOnUniverseObjectUnregistered = null!;
 | 
					    private readonly Event<IUniverse, IUniverse.UniverseObjectUnRegisteredArguments>.EventHandler delegateOnUniverseObjectUnregistered = null!;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private readonly List<T> monitoringBehaviours = new(32);
 | 
					    private readonly FastList<T> monitoringBehaviours = new(32);
 | 
				
			||||||
    protected readonly List<T> activeBehaviours = new(32);
 | 
					    protected readonly FastList<T> activeBehaviours = new(32);
 | 
				
			||||||
    protected readonly Dictionary<IActive, T> monitoringActiveToBehaviour = new(32);
 | 
					    protected readonly Dictionary<IActive, T> monitoringActiveToBehaviour = new(32);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public IUniverse Universe { get; private set; } = null!;
 | 
					    public IUniverse Universe { get; private set; } = null!;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,4 @@
 | 
				
			|||||||
using System;
 | 
					using System;
 | 
				
			||||||
using System.Collections.Generic;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace Engine.Core;
 | 
					namespace Engine.Core;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -15,7 +14,7 @@ public class BehaviourCollector<T> : IBehaviourCollector<T> where T : class
 | 
				
			|||||||
    private readonly Event<IUniverse, IUniverse.UniverseObjectRegisteredArguments>.EventHandler delegateOnUniverseObjectRegistered = null!;
 | 
					    private readonly Event<IUniverse, IUniverse.UniverseObjectRegisteredArguments>.EventHandler delegateOnUniverseObjectRegistered = null!;
 | 
				
			||||||
    private readonly Event<IUniverse, IUniverse.UniverseObjectUnRegisteredArguments>.EventHandler delegateOnUniverseObjectUnregistered = null!;
 | 
					    private readonly Event<IUniverse, IUniverse.UniverseObjectUnRegisteredArguments>.EventHandler delegateOnUniverseObjectUnregistered = null!;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    protected readonly List<T> behaviours = new(32);
 | 
					    protected readonly FastList<T> behaviours = new(32);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public IUniverse Universe { get; private set; } = null!;
 | 
					    public IUniverse Universe { get; private set; } = null!;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,7 +10,7 @@ public class BehaviourController : BaseEntity, IBehaviourController
 | 
				
			|||||||
    public Event<IBehaviourController, IBehaviourController.BehaviourRemovedArguments> OnBehaviourRemoved { get; } = new();
 | 
					    public Event<IBehaviourController, IBehaviourController.BehaviourRemovedArguments> OnBehaviourRemoved { get; } = new();
 | 
				
			||||||
    public Event<IHasUniverseObject> OnUniverseObjectAssigned { get; } = new();
 | 
					    public Event<IHasUniverseObject> OnUniverseObjectAssigned { get; } = new();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private readonly List<IBehaviour> behaviours = new(Constants.BEHAVIOURS_SIZE_INITIAL);
 | 
					    private readonly FastList<IBehaviour> behaviours = new(Constants.BEHAVIOURS_SIZE_INITIAL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private IUniverseObject _universeObject = null!;
 | 
					    private IUniverseObject _universeObject = null!;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										74
									
								
								Engine.Core/Helpers/FastList.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								Engine.Core/Helpers/FastList.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,74 @@
 | 
				
			|||||||
 | 
					using System.Collections;
 | 
				
			||||||
 | 
					using System.Collections.Generic;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Engine.Core;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class FastList<T> : IReadOnlyList<T>, IEnumerable<T> where T : notnull
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    private readonly List<T> items = [];
 | 
				
			||||||
 | 
					    private readonly Dictionary<T, int> indexMap = [];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public int Count => items.Count;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public T this[int index] => items[index];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public void Add(T item)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        indexMap[item] = items.Count;
 | 
				
			||||||
 | 
					        items.Add(item);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public void RemoveAt(int i) => Remove(items[i], i);
 | 
				
			||||||
 | 
					    public bool Remove(T item)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if (!indexMap.TryGetValue(item, out int index))
 | 
				
			||||||
 | 
					            return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Remove(item, index);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private void Remove(T item, int index)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        int lastIndex = items.Count - 1;
 | 
				
			||||||
 | 
					        T lastItem = items[lastIndex];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        items[index] = lastItem;
 | 
				
			||||||
 | 
					        indexMap[lastItem] = index;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        items.RemoveAt(lastIndex);
 | 
				
			||||||
 | 
					        indexMap.Remove(item);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public void Insert(int index, T item)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        items.Insert(index, item);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for (int i = index; i < items.Count; i++)
 | 
				
			||||||
 | 
					            indexMap[items[i]] = i;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public void Clear()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        items.Clear();
 | 
				
			||||||
 | 
					        indexMap.Clear();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public bool Contains(T item) => indexMap.ContainsKey(item);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public int BinarySearch(T item, IComparer<T>? comparer = null) => items.BinarySearch(item, comparer);
 | 
				
			||||||
 | 
					    public void Sort(IComparer<T> comparer)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        items.Sort(comparer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for (int i = 0; i < items.Count; i++)
 | 
				
			||||||
 | 
					            indexMap[items[i]] = i;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public IEnumerator<T> GetEnumerator() => items.GetEnumerator();
 | 
				
			||||||
 | 
					    IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public FastList() { }
 | 
				
			||||||
 | 
					    public FastList(int count) { items.Capacity = count; }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user