perf: tween manager pooling
This commit is contained in:
parent
b1b5af94d3
commit
996e61d0ad
@ -8,17 +8,36 @@ namespace Syntriax.Engine.Systems.Tween;
|
||||
public class TweenManager : UniverseObject, ITweenManager
|
||||
{
|
||||
private CoroutineManager coroutineManager = null!;
|
||||
private readonly Queue<Tween> queue = new();
|
||||
|
||||
private readonly Dictionary<ITween, IEnumerator> runningCoroutines = [];
|
||||
|
||||
public ITween StartTween(float duration, ITweenManager.TweenSetCallback? setCallback = null)
|
||||
{
|
||||
Tween tween = new(duration);
|
||||
Tween tween = Get(duration);
|
||||
tween.OnUpdated += tween => setCallback?.Invoke(tween.Value);
|
||||
runningCoroutines.Add(tween, coroutineManager.StartCoroutine(RunTween(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)
|
||||
{
|
||||
tween.State = TweenState.Playing;
|
||||
|
Loading…
x
Reference in New Issue
Block a user