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,16 +1,18 @@
|
||||
using Syntriax.Engine.Core;
|
||||
|
||||
namespace Syntriax.Engine.Systems.Tween;
|
||||
|
||||
public interface ITween
|
||||
{
|
||||
event TweenEventHandler? OnStarted;
|
||||
event TweenEventHandler? OnPaused;
|
||||
event TweenEventHandler? OnResumed;
|
||||
event TweenEventHandler? OnCancelled;
|
||||
event TweenEventHandler? OnCompleted;
|
||||
event TweenEventHandler? OnEnded;
|
||||
Event<ITween> OnStarted { get; }
|
||||
Event<ITween> OnPaused { get; }
|
||||
Event<ITween> OnResumed { get; }
|
||||
Event<ITween> OnCancelled { get; }
|
||||
Event<ITween> OnCompleted { get; }
|
||||
Event<ITween> OnEnded { get; }
|
||||
|
||||
event TweenEventHandler? OnUpdated;
|
||||
event TweenDeltaEventHandler? OnDeltaUpdated;
|
||||
Event<ITween> OnUpdated { get; }
|
||||
Event<ITween, TweenDeltaArguments> OnDeltaUpdated { get; }
|
||||
|
||||
TweenState State { get; set; }
|
||||
|
||||
@@ -19,7 +21,6 @@ public interface ITween
|
||||
float Progress { get; }
|
||||
float Value { get; }
|
||||
|
||||
delegate void TweenEventHandler(ITween sender);
|
||||
delegate void TweenDeltaEventHandler(ITween sender, float delta);
|
||||
readonly record struct TweenDeltaArguments(float Delta);
|
||||
}
|
||||
|
||||
|
@@ -4,14 +4,14 @@ namespace Syntriax.Engine.Systems.Tween;
|
||||
|
||||
internal class Tween : ITween
|
||||
{
|
||||
public event ITween.TweenEventHandler? OnStarted = null;
|
||||
public event ITween.TweenEventHandler? OnPaused = null;
|
||||
public event ITween.TweenEventHandler? OnResumed = null;
|
||||
public event ITween.TweenEventHandler? OnCancelled = null;
|
||||
public event ITween.TweenEventHandler? OnCompleted = null;
|
||||
public event ITween.TweenEventHandler? OnEnded = null;
|
||||
public event ITween.TweenEventHandler? OnUpdated = null;
|
||||
public event ITween.TweenDeltaEventHandler? OnDeltaUpdated = null;
|
||||
public Event<ITween> OnStarted { get; } = new();
|
||||
public Event<ITween> OnPaused { get; } = new();
|
||||
public Event<ITween> OnResumed { get; } = new();
|
||||
public Event<ITween> OnCancelled { get; } = new();
|
||||
public Event<ITween> OnCompleted { get; } = new();
|
||||
public Event<ITween> OnEnded { get; } = new();
|
||||
public Event<ITween> OnUpdated { get; } = new();
|
||||
public Event<ITween, ITween.TweenDeltaArguments> OnDeltaUpdated { get; } = new();
|
||||
|
||||
private TweenState _state = TweenState.Idle;
|
||||
public TweenState State
|
||||
@@ -60,7 +60,7 @@ internal class Tween : ITween
|
||||
Progress = Counter / Duration;
|
||||
OnUpdated?.Invoke(this);
|
||||
|
||||
OnDeltaUpdated?.Invoke(this, Easing.Evaluate(Progress) - Easing.Evaluate(previousProgress));
|
||||
OnDeltaUpdated?.Invoke(this, new(Easing.Evaluate(Progress) - Easing.Evaluate(previousProgress)));
|
||||
|
||||
if (_counter >= Duration)
|
||||
State = TweenState.Completed;
|
||||
@@ -74,6 +74,22 @@ internal class Tween : ITween
|
||||
State = TweenState.Idle;
|
||||
}
|
||||
|
||||
internal void Wipe()
|
||||
{
|
||||
OnStarted.Clear();
|
||||
OnPaused.Clear();
|
||||
OnResumed.Clear();
|
||||
OnCancelled.Clear();
|
||||
OnCompleted.Clear();
|
||||
OnEnded.Clear();
|
||||
OnUpdated.Clear();
|
||||
OnDeltaUpdated.Clear();
|
||||
|
||||
Easing = EaseLinear.Instance;
|
||||
|
||||
Reset();
|
||||
}
|
||||
|
||||
public Tween() { }
|
||||
public Tween(float duration)
|
||||
{
|
||||
|
@@ -1,7 +1,5 @@
|
||||
using System;
|
||||
|
||||
using Syntriax.Engine.Core;
|
||||
|
||||
namespace Syntriax.Engine.Systems.Tween;
|
||||
|
||||
public static class TweenExtensions
|
||||
@@ -11,14 +9,14 @@ public static class TweenExtensions
|
||||
Tween tweenConcrete = (Tween)tween;
|
||||
int counter = count;
|
||||
|
||||
tweenConcrete.OnCompleted += _ =>
|
||||
tweenConcrete.OnCompleted.AddListener(_ =>
|
||||
{
|
||||
if (counter-- <= 0)
|
||||
return;
|
||||
|
||||
tweenConcrete.Reset();
|
||||
tweenConcrete.State = TweenState.Playing;
|
||||
};
|
||||
});
|
||||
|
||||
return tween;
|
||||
}
|
||||
@@ -26,11 +24,11 @@ public static class TweenExtensions
|
||||
public static ITween LoopInfinitely(this ITween tween)
|
||||
{
|
||||
Tween tweenConcrete = (Tween)tween;
|
||||
tweenConcrete.OnCompleted += _ =>
|
||||
tweenConcrete.OnCompleted.AddListener(_ =>
|
||||
{
|
||||
tweenConcrete.Reset();
|
||||
tweenConcrete.State = TweenState.Playing;
|
||||
};
|
||||
});
|
||||
|
||||
return tween;
|
||||
}
|
||||
@@ -45,57 +43,49 @@ public static class TweenExtensions
|
||||
|
||||
public static ITween OnStart(this ITween tween, Action callback)
|
||||
{
|
||||
Tween tweenConcrete = (Tween)tween;
|
||||
tweenConcrete.OnStarted += _ => callback.Invoke();
|
||||
tween.OnStarted.AddListener(_ => callback.Invoke());
|
||||
return tween;
|
||||
}
|
||||
|
||||
public static ITween OnPause(this ITween tween, Action callback)
|
||||
{
|
||||
Tween tweenConcrete = (Tween)tween;
|
||||
tweenConcrete.OnPaused += _ => callback.Invoke();
|
||||
tween.OnPaused.AddListener(_ => callback.Invoke());
|
||||
return tween;
|
||||
}
|
||||
|
||||
public static ITween OnResume(this ITween tween, Action callback)
|
||||
{
|
||||
Tween tweenConcrete = (Tween)tween;
|
||||
tweenConcrete.OnResumed += _ => callback.Invoke();
|
||||
tween.OnResumed.AddListener(_ => callback.Invoke());
|
||||
return tween;
|
||||
}
|
||||
|
||||
public static ITween OnCancel(this ITween tween, Action callback)
|
||||
{
|
||||
Tween tweenConcrete = (Tween)tween;
|
||||
tweenConcrete.OnCancelled += _ => callback.Invoke();
|
||||
tween.OnCancelled.AddListener(_ => callback.Invoke());
|
||||
return tween;
|
||||
}
|
||||
|
||||
public static ITween OnComplete(this ITween tween, Action callback)
|
||||
{
|
||||
Tween tweenConcrete = (Tween)tween;
|
||||
tweenConcrete.OnCompleted += _ => callback.Invoke();
|
||||
tween.OnCompleted.AddListener(_ => callback.Invoke());
|
||||
return tween;
|
||||
}
|
||||
|
||||
public static ITween OnEnd(this ITween tween, Action callback)
|
||||
{
|
||||
Tween tweenConcrete = (Tween)tween;
|
||||
tweenConcrete.OnEnded += _ => callback.Invoke();
|
||||
tween.OnEnded.AddListener(_ => callback.Invoke());
|
||||
return tween;
|
||||
}
|
||||
|
||||
public static ITween OnUpdate(this ITween tween, Action callback)
|
||||
{
|
||||
Tween tweenConcrete = (Tween)tween;
|
||||
tweenConcrete.OnUpdated += _ => callback.Invoke();
|
||||
tween.OnUpdated.AddListener(_ => callback.Invoke());
|
||||
return tween;
|
||||
}
|
||||
|
||||
public static ITween OnDeltaUpdate(this ITween tween, Action<float> callback)
|
||||
{
|
||||
Tween tweenConcrete = (Tween)tween;
|
||||
tweenConcrete.OnDeltaUpdated += (_, delta) => callback.Invoke(delta);
|
||||
tween.OnDeltaUpdated.AddListener((_, arguments) => callback.Invoke(arguments.Delta));
|
||||
return tween;
|
||||
}
|
||||
}
|
||||
|
@@ -15,7 +15,7 @@ public class TweenManager : UniverseObject, ITweenManager
|
||||
public ITween StartTween(float duration, ITweenManager.TweenSetCallback? setCallback = null)
|
||||
{
|
||||
Tween tween = Get(duration);
|
||||
tween.OnUpdated += tween => setCallback?.Invoke(tween.Value);
|
||||
tween.OnUpdated.AddListener(tween => setCallback?.Invoke(tween.Value));
|
||||
runningCoroutines.Add(tween, coroutineManager.StartCoroutine(RunTween(tween)));
|
||||
return tween;
|
||||
}
|
||||
@@ -59,6 +59,7 @@ public class TweenManager : UniverseObject, ITweenManager
|
||||
}
|
||||
|
||||
runningCoroutines.Remove(tween);
|
||||
Return(tween);
|
||||
}
|
||||
|
||||
public void CancelTween(ITween tween)
|
||||
|
Reference in New Issue
Block a user