perf!: events refactored throughout all the project to use Event<> class
All delegate events are refactored to use the Event<TSender> and Event<TSender, TArgument> for performance issues regarding delegate events creating garbage, also this gives us better control on event invocation since C# Delegates did also create unnecessary garbage during Delegate.DynamicInvoke
This commit is contained in:
@@ -1,5 +1,4 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
@@ -8,11 +7,11 @@ namespace Syntriax.Engine.Core;
|
||||
[System.Diagnostics.DebuggerDisplay("Behaviour Count: {behaviours.Count}")]
|
||||
public class BehaviourController : BaseEntity, IBehaviourController
|
||||
{
|
||||
public event IBehaviourController.BehaviourAddedEventHandler? OnBehaviourAdded = null;
|
||||
public event IBehaviourController.BehaviourRemovedEventHandler? OnBehaviourRemoved = null;
|
||||
public event IHasUniverseObject.UniverseObjectAssignedEventHandler? OnUniverseObjectAssigned = null;
|
||||
public Event<IBehaviourController, IBehaviourController.BehaviourAddedArguments> OnBehaviourAdded { get; } = new();
|
||||
public Event<IBehaviourController, IBehaviourController.BehaviourRemovedArguments> OnBehaviourRemoved { get; } = new();
|
||||
public Event<IHasUniverseObject> OnUniverseObjectAssigned { get; } = new();
|
||||
|
||||
private readonly IList<IBehaviour> behaviours = new List<IBehaviour>(Constants.BEHAVIOURS_SIZE_INITIAL);
|
||||
private readonly List<IBehaviour> behaviours = new(Constants.BEHAVIOURS_SIZE_INITIAL);
|
||||
|
||||
private IUniverseObject _universeObject = null!;
|
||||
|
||||
@@ -28,8 +27,9 @@ public class BehaviourController : BaseEntity, IBehaviourController
|
||||
|
||||
if (IsInitialized)
|
||||
behaviour.Initialize();
|
||||
behaviour.OnPriorityChanged += OnPriorityChange;
|
||||
OnBehaviourAdded?.Invoke(this, behaviour);
|
||||
|
||||
behaviour.OnPriorityChanged.AddListener(OnPriorityChange);
|
||||
OnBehaviourAdded?.Invoke(this, new(behaviour));
|
||||
return behaviour;
|
||||
}
|
||||
|
||||
@@ -94,10 +94,10 @@ public class BehaviourController : BaseEntity, IBehaviourController
|
||||
if (!behaviours.Contains(behaviour))
|
||||
throw new Exception($"{behaviour.GetType().Name} does not exist in {UniverseObject.Name}'s {nameof(IBehaviourController)}.");
|
||||
|
||||
behaviour.OnPriorityChanged -= OnPriorityChange;
|
||||
behaviour.OnPriorityChanged.RemoveListener(OnPriorityChange);
|
||||
behaviour.Finalize();
|
||||
behaviours.Remove(behaviour);
|
||||
OnBehaviourRemoved?.Invoke(this, behaviour);
|
||||
OnBehaviourRemoved?.Invoke(this, new(behaviour));
|
||||
}
|
||||
|
||||
protected virtual void OnAssign(IUniverseObject universeObject) { }
|
||||
@@ -146,7 +146,7 @@ public class BehaviourController : BaseEntity, IBehaviourController
|
||||
behaviours.Add(behaviour);
|
||||
}
|
||||
|
||||
private void OnPriorityChange(IBehaviour sender, int previousPriority)
|
||||
private void OnPriorityChange(IBehaviour sender, IBehaviour.PriorityChangedArguments args)
|
||||
{
|
||||
behaviours.Remove(sender);
|
||||
InsertBehaviourByPriority(sender);
|
||||
|
Reference in New Issue
Block a user