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:
@@ -4,10 +4,10 @@ namespace Syntriax.Engine.Systems.StateMachine;
|
||||
|
||||
public interface IState : IEntity, INameable
|
||||
{
|
||||
event StateUpdateEventHandler? OnStateUpdate;
|
||||
event StateTransitionedFromEventHandler? OnStateTransitionedFrom;
|
||||
event StateTransitionedToEventHandler? OnStateTransitionedTo;
|
||||
event StateTransitionReadyEventHandler? OnStateTransitionReady;
|
||||
Event<IState> OnStateUpdate { get; }
|
||||
Event<IState, StateTransitionedFromArguments> OnStateTransitionedFrom { get; }
|
||||
Event<IState, StateTransitionedToArguments> OnStateTransitionedTo { get; }
|
||||
Event<IState, StateTransitionReadyArguments> OnStateTransitionReady { get; }
|
||||
|
||||
IState? GetNextState();
|
||||
|
||||
@@ -15,8 +15,7 @@ public interface IState : IEntity, INameable
|
||||
void TransitionTo(IState from);
|
||||
void TransitionFrom(IState to);
|
||||
|
||||
delegate void StateUpdateEventHandler(IState sender);
|
||||
delegate void StateTransitionedFromEventHandler(IState sender, IState toState);
|
||||
delegate void StateTransitionedToEventHandler(IState sender, IState fromState);
|
||||
delegate void StateTransitionReadyEventHandler(IState sender, IState toState);
|
||||
readonly record struct StateTransitionedFromArguments(IState ToState);
|
||||
readonly record struct StateTransitionedToArguments(IState FromState);
|
||||
readonly record struct StateTransitionReadyArguments(IState ToState);
|
||||
}
|
||||
|
@@ -6,11 +6,11 @@ namespace Syntriax.Engine.Systems.StateMachine;
|
||||
|
||||
public class State : BaseEntity, IState
|
||||
{
|
||||
public event IState.StateUpdateEventHandler? OnStateUpdate = null;
|
||||
public event IState.StateTransitionedFromEventHandler? OnStateTransitionedFrom = null;
|
||||
public event IState.StateTransitionedToEventHandler? OnStateTransitionedTo = null;
|
||||
public event IState.StateTransitionReadyEventHandler? OnStateTransitionReady = null;
|
||||
public event INameable.NameChangedEventHandler? OnNameChanged = null;
|
||||
public Event<IState> OnStateUpdate { get; } = new();
|
||||
public Event<IState, IState.StateTransitionedFromArguments> OnStateTransitionedFrom { get; } = new();
|
||||
public Event<IState, IState.StateTransitionedToArguments> OnStateTransitionedTo { get; } = new();
|
||||
public Event<IState, IState.StateTransitionReadyArguments> OnStateTransitionReady { get; } = new();
|
||||
public Event<INameable, INameable.NameChangedArguments> OnNameChanged { get; } = new();
|
||||
|
||||
private readonly List<StateTransition> transitions = [];
|
||||
private readonly Dictionary<string, StateTransition> possibleTransitions = [];
|
||||
@@ -28,7 +28,7 @@ public class State : BaseEntity, IState
|
||||
|
||||
string previousName = _name;
|
||||
_name = value;
|
||||
OnNameChanged?.Invoke(this, previousName);
|
||||
OnNameChanged?.Invoke(this, new(previousName));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -53,12 +53,12 @@ public class State : BaseEntity, IState
|
||||
public void Update()
|
||||
{
|
||||
if (GetNextState() is IState transitionState)
|
||||
OnStateTransitionReady?.Invoke(this, transitionState);
|
||||
OnStateTransitionReady?.Invoke(this, new(transitionState));
|
||||
OnStateUpdate?.Invoke(this);
|
||||
}
|
||||
|
||||
public void TransitionTo(IState from) => OnStateTransitionedTo?.Invoke(this, from);
|
||||
public void TransitionFrom(IState to) => OnStateTransitionedFrom?.Invoke(this, to);
|
||||
public void TransitionTo(IState from) => OnStateTransitionedTo?.Invoke(this, new(from));
|
||||
public void TransitionFrom(IState to) => OnStateTransitionedFrom?.Invoke(this, new(to));
|
||||
|
||||
public IState? GetNextState()
|
||||
{
|
||||
|
@@ -4,12 +4,11 @@ namespace Syntriax.Engine.Systems.StateMachine;
|
||||
|
||||
public abstract class StateBehaviourBase : Behaviour, IState
|
||||
{
|
||||
public event IState.StateUpdateEventHandler? OnStateUpdate = null;
|
||||
public event IState.StateTransitionedFromEventHandler? OnStateTransitionedFrom = null;
|
||||
public event IState.StateTransitionedToEventHandler? OnStateTransitionedTo = null;
|
||||
public event INameable.NameChangedEventHandler? OnNameChanged = null;
|
||||
|
||||
public abstract event IState.StateTransitionReadyEventHandler? OnStateTransitionReady;
|
||||
public Event<IState> OnStateUpdate { get; } = new();
|
||||
public Event<IState, IState.StateTransitionedFromArguments> OnStateTransitionedFrom { get; } = new();
|
||||
public Event<IState, IState.StateTransitionedToArguments> OnStateTransitionedTo { get; } = new();
|
||||
public Event<IState, IState.StateTransitionReadyArguments> OnStateTransitionReady { get; } = new();
|
||||
public Event<INameable, INameable.NameChangedArguments> OnNameChanged { get; } = new();
|
||||
|
||||
private string _name = string.Empty;
|
||||
public string Name
|
||||
@@ -22,7 +21,7 @@ public abstract class StateBehaviourBase : Behaviour, IState
|
||||
|
||||
string previousName = _name;
|
||||
_name = value;
|
||||
OnNameChanged?.Invoke(this, previousName);
|
||||
OnNameChanged?.Invoke(this, new(previousName));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,14 +36,14 @@ public abstract class StateBehaviourBase : Behaviour, IState
|
||||
public void TransitionTo(IState from)
|
||||
{
|
||||
OnTransitionedToState(from);
|
||||
OnStateTransitionedTo?.Invoke(this, from);
|
||||
OnStateTransitionedTo?.Invoke(this, new(from));
|
||||
}
|
||||
|
||||
protected virtual void OnTransitionedFromState(IState to) { }
|
||||
public void TransitionFrom(IState to)
|
||||
{
|
||||
OnTransitionedFromState(to);
|
||||
OnStateTransitionedFrom?.Invoke(this, to);
|
||||
OnStateTransitionedFrom?.Invoke(this, new(to));
|
||||
}
|
||||
|
||||
public abstract IState? GetNextState();
|
||||
|
@@ -5,9 +5,17 @@ namespace Syntriax.Engine.Systems.StateMachine;
|
||||
|
||||
public class StateMachine : Behaviour
|
||||
{
|
||||
public event StateChangedEventHandler? OnStateChanged = null;
|
||||
public Event<StateMachine, StateChangedArguments> OnStateChanged { get; } = new();
|
||||
|
||||
private readonly Event<IState, IState.StateTransitionReadyArguments>.EventHandler delegateOnStateTransitionReady = null!;
|
||||
|
||||
private IState _state = new State();
|
||||
|
||||
public StateMachine()
|
||||
{
|
||||
delegateOnStateTransitionReady = OnStateTransitionReady;
|
||||
}
|
||||
|
||||
[Serialize]
|
||||
public IState State
|
||||
{
|
||||
@@ -18,20 +26,20 @@ public class StateMachine : Behaviour
|
||||
return;
|
||||
|
||||
IState previousState = _state;
|
||||
previousState.OnStateTransitionReady -= OnStateTransitionReady;
|
||||
previousState.OnStateTransitionReady.RemoveListener(delegateOnStateTransitionReady);
|
||||
|
||||
_state = value;
|
||||
previousState.TransitionFrom(value);
|
||||
value.TransitionTo(_state);
|
||||
OnStateChanged?.Invoke(this, previousState, value);
|
||||
OnStateChanged?.Invoke(this, new(value, previousState));
|
||||
|
||||
value.OnStateTransitionReady += OnStateTransitionReady;
|
||||
value.OnStateTransitionReady.AddListener(delegateOnStateTransitionReady);
|
||||
}
|
||||
}
|
||||
|
||||
private void OnStateTransitionReady(IState sender, IState toState)
|
||||
private void OnStateTransitionReady(IState sender, IState.StateTransitionReadyArguments args)
|
||||
{
|
||||
State = toState;
|
||||
State = args.ToState;
|
||||
while (State.GetNextState() is IState nextState)
|
||||
State = nextState;
|
||||
}
|
||||
@@ -47,5 +55,5 @@ public class StateMachine : Behaviour
|
||||
State.Update();
|
||||
}
|
||||
|
||||
public delegate void StateChangedEventHandler(StateMachine sender, IState previousState, IState newState);
|
||||
public readonly record struct StateChangedArguments(IState CurrentState, IState PreviousState);
|
||||
}
|
||||
|
Reference in New Issue
Block a user