perf!: behaviour controller memory allocation issues fixed by removing the enumerable interface

This commit is contained in:
Syntriax 2025-05-30 12:12:27 +03:00
parent b0f8b0dad6
commit b1b5af94d3
4 changed files with 21 additions and 12 deletions

View File

@ -5,7 +5,7 @@ namespace Syntriax.Engine.Core;
/// <summary>
/// Represents a controller for managing <see cref="IBehaviour"/>s. Connected to an <see cref="IUniverseObject"/>.
/// </summary>
public interface IBehaviourController : IEntity, IHasUniverseObject, IEnumerable<IBehaviour>
public interface IBehaviourController : IEntity, IHasUniverseObject
{
/// <summary>
/// Event triggered when a <see cref="IBehaviour"/> is added to the <see cref="IBehaviourController"/>.
@ -17,6 +17,16 @@ public interface IBehaviourController : IEntity, IHasUniverseObject, IEnumerable
/// </summary>
event BehaviourRemovedEventHandler? OnBehaviourRemoved;
/// <summary>
/// Amount of <see cref="IBehaviour"/> collected.
/// </summary>
int Count { get; }
/// <summary>
/// Get a <see cref="IBehaviour"/> collected by it's index.
/// </summary>
IBehaviour this[System.Index index] { get; }
/// <summary>
/// Adds a <see cref="IBehaviour"/> to the <see cref="IBehaviourController"/>.
/// </summary>

View File

@ -25,8 +25,8 @@ public class ActiveBehaviourCollector<T> : IBehaviourCollector<T> where T : clas
universeObject.BehaviourController.OnBehaviourAdded += OnBehaviourAdded;
universeObject.BehaviourController.OnBehaviourRemoved += OnBehaviourRemoved;
foreach (IBehaviour item in universeObject.BehaviourController)
OnBehaviourAdded(universeObject.BehaviourController, item);
for (int i = 0; i < universeObject.BehaviourController.Count; i++)
OnBehaviourAdded(universeObject.BehaviourController, universeObject.BehaviourController[i]);
}
private void OnUniverseObjectUnregistered(IUniverse manager, IUniverseObject universeObject)
@ -34,8 +34,8 @@ public class ActiveBehaviourCollector<T> : IBehaviourCollector<T> where T : clas
universeObject.BehaviourController.OnBehaviourAdded -= OnBehaviourAdded;
universeObject.BehaviourController.OnBehaviourRemoved -= OnBehaviourRemoved;
foreach (IBehaviour item in universeObject.BehaviourController)
OnBehaviourRemoved(universeObject.BehaviourController, item);
for (int i = 0; i < universeObject.BehaviourController.Count; i++)
OnBehaviourRemoved(universeObject.BehaviourController, universeObject.BehaviourController[i]);
}
protected virtual void OnBehaviourAdd(IBehaviour behaviour) { }

View File

@ -23,8 +23,8 @@ public class BehaviourCollector<T> : IBehaviourCollector<T> where T : class
universeObject.BehaviourController.OnBehaviourAdded += OnBehaviourAdded;
universeObject.BehaviourController.OnBehaviourRemoved += OnBehaviourRemoved;
foreach (IBehaviour item in universeObject.BehaviourController)
OnBehaviourAdded(universeObject.BehaviourController, item);
for (int i = 0; i < universeObject.BehaviourController.Count; i++)
OnBehaviourAdded(universeObject.BehaviourController, universeObject.BehaviourController[i]);
}
private void OnUniverseObjectUnregistered(IUniverse manager, IUniverseObject universeObject)
@ -32,8 +32,8 @@ public class BehaviourCollector<T> : IBehaviourCollector<T> where T : class
universeObject.BehaviourController.OnBehaviourAdded -= OnBehaviourAdded;
universeObject.BehaviourController.OnBehaviourRemoved -= OnBehaviourRemoved;
foreach (IBehaviour item in universeObject.BehaviourController)
OnBehaviourRemoved(universeObject.BehaviourController, item);
for (int i = 0; i < universeObject.BehaviourController.Count; i++)
OnBehaviourRemoved(universeObject.BehaviourController, universeObject.BehaviourController[i]);
}
protected virtual void OnBehaviourAdd(IBehaviour behaviour) { }

View File

@ -17,6 +17,8 @@ public class BehaviourController : BaseEntity, IBehaviourController
private IUniverseObject _universeObject = null!;
public IUniverseObject UniverseObject => _universeObject;
public int Count => behaviours.Count;
public IBehaviour this[Index index] => behaviours[index];
public T AddBehaviour<T>(T behaviour) where T : class, IBehaviour
{
@ -149,7 +151,4 @@ public class BehaviourController : BaseEntity, IBehaviourController
behaviours.Remove(sender);
InsertBehaviourByPriority(sender);
}
public IEnumerator<IBehaviour> GetEnumerator() => behaviours.GetEnumerator();
IEnumerator IEnumerable.GetEnumerator() => behaviours.GetEnumerator();
}