perf: tween manager pooling

This commit is contained in:
Syntriax 2025-05-30 23:50:06 +03:00
parent b1b5af94d3
commit 996e61d0ad

View File

@ -8,17 +8,36 @@ namespace Syntriax.Engine.Systems.Tween;
public class TweenManager : UniverseObject, ITweenManager public class TweenManager : UniverseObject, ITweenManager
{ {
private CoroutineManager coroutineManager = null!; private CoroutineManager coroutineManager = null!;
private readonly Queue<Tween> queue = new();
private readonly Dictionary<ITween, IEnumerator> runningCoroutines = []; private readonly Dictionary<ITween, IEnumerator> runningCoroutines = [];
public ITween StartTween(float duration, ITweenManager.TweenSetCallback? setCallback = null) public ITween StartTween(float duration, ITweenManager.TweenSetCallback? setCallback = null)
{ {
Tween tween = new(duration); Tween tween = Get(duration);
tween.OnUpdated += tween => setCallback?.Invoke(tween.Value); tween.OnUpdated += tween => setCallback?.Invoke(tween.Value);
runningCoroutines.Add(tween, coroutineManager.StartCoroutine(RunTween(tween))); runningCoroutines.Add(tween, coroutineManager.StartCoroutine(RunTween(tween)));
return tween; return tween;
} }
private Tween Get(float duration)
{
if (!queue.TryDequeue(out Tween? result))
result = new(duration);
result.Duration = duration;
return result;
}
private void Return(Tween tween)
{
if (queue.Contains(tween))
return;
tween.Wipe();
queue.Enqueue(tween);
}
private IEnumerator RunTween(Tween tween) private IEnumerator RunTween(Tween tween)
{ {
tween.State = TweenState.Playing; tween.State = TweenState.Playing;