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:
2025-05-31 00:14:43 +03:00
parent 996e61d0ad
commit 61e2761580
58 changed files with 637 additions and 485 deletions

View File

@@ -1,18 +1,19 @@
using Syntriax.Engine.Core;
namespace Syntriax.Engine.Systems.Time;
public interface IReadOnlyStopwatch
{
event StopwatchEventHandler? OnStarted;
event StopwatchDeltaEventHandler? OnDelta;
event StopwatchEventHandler? OnStopped;
Event<IReadOnlyStopwatch> OnStarted { get; }
Event<IReadOnlyStopwatch, StopwatchDeltaArguments> OnDelta { get; }
Event<IReadOnlyStopwatch> OnStopped { get; }
double Time { get; }
TimerState State { get; }
event StopwatchEventHandler? OnPaused;
event StopwatchEventHandler? OnResumed;
Event<IReadOnlyStopwatch> OnPaused { get; }
Event<IReadOnlyStopwatch> OnResumed { get; }
delegate void StopwatchEventHandler(IReadOnlyStopwatch sender);
delegate void StopwatchDeltaEventHandler(IReadOnlyStopwatch sender, double delta);
readonly record struct StopwatchDeltaArguments(double Delta);
}

View File

@@ -1,11 +1,11 @@
using Syntriax.Engine.Core;
namespace Syntriax.Engine.Systems.Time;
public interface IReadOnlyTicker : IReadOnlyStopwatch
{
event TickerTickEventHandler? OnTick;
Event<IReadOnlyTicker> OnTick { get; }
int TickCounter { get; }
double TickPeriod { get; set; }
delegate void TickerTickEventHandler(IReadOnlyTicker sender);
}

View File

@@ -1,13 +1,15 @@
using Syntriax.Engine.Core;
namespace Syntriax.Engine.Systems.Time;
public interface IReadOnlyTimer
{
event TimerEventHandler? OnStarted;
event TimerDeltaEventHandler? OnDelta;
event TimerEventHandler? OnStopped;
Event<IReadOnlyTimer> OnStarted { get; }
Event<IReadOnlyTimer, TimerDeltaArguments> OnDelta { get; }
Event<IReadOnlyTimer> OnStopped { get; }
event TimerEventHandler? OnPaused;
event TimerEventHandler? OnResumed;
Event<IReadOnlyTimer> OnPaused { get; }
Event<IReadOnlyTimer> OnResumed { get; }
double StartTime { get; }
double Remaining { get; }
@@ -16,7 +18,6 @@ public interface IReadOnlyTimer
TimerState State { get; }
delegate void TimerEventHandler(IReadOnlyTimer sender);
delegate void TimerDeltaEventHandler(IReadOnlyTimer sender, double delta);
readonly record struct TimerDeltaArguments(double delta);
}

View File

@@ -1,11 +1,11 @@
using Syntriax.Engine.Core;
namespace Syntriax.Engine.Systems.Time;
public interface ITicker : IStopwatch
{
event TickerTickEventHandler? OnTick;
Event<ITicker> OnTick { get; }
int TickCounter { get; }
double Period { get; set; }
delegate void TickerTickEventHandler(ITicker sender);
}

View File

@@ -4,11 +4,11 @@ namespace Syntriax.Engine.Systems.Time;
public class StopwatchBehaviour : Behaviour, IStopwatch
{
public event IReadOnlyStopwatch.StopwatchEventHandler? OnStarted = null;
public event IReadOnlyStopwatch.StopwatchDeltaEventHandler? OnDelta = null;
public event IReadOnlyStopwatch.StopwatchEventHandler? OnStopped = null;
public event IReadOnlyStopwatch.StopwatchEventHandler? OnPaused = null;
public event IReadOnlyStopwatch.StopwatchEventHandler? OnResumed = null;
public Event<IReadOnlyStopwatch> OnStarted { get; } = new();
public Event<IReadOnlyStopwatch, IReadOnlyStopwatch.StopwatchDeltaArguments> OnDelta { get; } = new();
public Event<IReadOnlyStopwatch> OnStopped { get; } = new();
public Event<IReadOnlyStopwatch> OnPaused { get; } = new();
public Event<IReadOnlyStopwatch> OnResumed { get; } = new();
public double Time { get; protected set; } = 0f;
public TimerState State { get; protected set; } = TimerState.Idle;
@@ -46,7 +46,7 @@ public class StopwatchBehaviour : Behaviour, IStopwatch
double delta = Universe.Time.DeltaSpan.TotalSeconds;
Time += delta;
OnDelta?.Invoke(this, delta);
OnDelta?.Invoke(this, new(delta));
}
protected override void OnEnteredUniverse(IUniverse universe)

View File

@@ -4,7 +4,7 @@ namespace Syntriax.Engine.Systems.Time;
public class TickerBehaviour : StopwatchBehaviour, ITicker
{
public event ITicker.TickerTickEventHandler? OnTick = null;
public Event<ITicker> OnTick { get; } = new();
public double Period { get; set; } = 1f;
public int TickCounter { get; private set; } = 0;

View File

@@ -4,11 +4,11 @@ namespace Syntriax.Engine.Systems.Time;
public class TimerBehaviour : Behaviour, ITimer
{
public event IReadOnlyTimer.TimerEventHandler? OnStarted = null;
public event IReadOnlyTimer.TimerDeltaEventHandler? OnDelta = null;
public event IReadOnlyTimer.TimerEventHandler? OnStopped = null;
public event IReadOnlyTimer.TimerEventHandler? OnPaused = null;
public event IReadOnlyTimer.TimerEventHandler? OnResumed = null;
public Event<IReadOnlyTimer> OnStarted { get; } = new();
public Event<IReadOnlyTimer, IReadOnlyTimer.TimerDeltaArguments> OnDelta { get; } = new();
public Event<IReadOnlyTimer> OnStopped { get; } = new();
public Event<IReadOnlyTimer> OnPaused { get; } = new();
public Event<IReadOnlyTimer> OnResumed { get; } = new();
public TimerState State { get; protected set; } = TimerState.Idle;
public double StartTime { get; protected set; } = 0f;
@@ -61,7 +61,7 @@ public class TimerBehaviour : Behaviour, ITimer
double delta = Universe.Time.DeltaSpan.TotalSeconds;
Remaining -= delta;
OnDelta?.Invoke(this, delta);
OnDelta?.Invoke(this, new(delta));
if (Remaining <= .0f)
Stop();