From 785fee9b6b45369097579d2ece44065c6ebb8828 Mon Sep 17 00:00:00 2001 From: Syntriax Date: Fri, 20 Feb 2026 11:22:34 +0300 Subject: [PATCH] perf: memory allocation improvements on ITween.Loop method --- Engine.Systems/Tween/TweenExtensions.cs | 32 +++++++++++++++++-------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/Engine.Systems/Tween/TweenExtensions.cs b/Engine.Systems/Tween/TweenExtensions.cs index 8ff8cc3..b2f1b1a 100644 --- a/Engine.Systems/Tween/TweenExtensions.cs +++ b/Engine.Systems/Tween/TweenExtensions.cs @@ -4,23 +4,35 @@ namespace Engine.Systems.Tween; public static class TweenExtensions { + private static readonly System.Collections.Generic.Dictionary loopDictionary = []; + public static ITween Loop(this ITween tween, int count) { - Tween tweenConcrete = (Tween)tween; - int counter = count; + if (!loopDictionary.TryAdd(tween, count)) + throw new($"Tween already has a loop in progress."); - tweenConcrete.OnCompleted.AddListener(_ => - { - if (counter-- <= 0) - return; - - tweenConcrete.Reset(); - tweenConcrete.State = TweenState.Playing; - }); + tween.OnCompleted.AddListener(looperDelegate); + tween.OnEnded.AddListener(looperEndDelegate); return tween; } + private static readonly Core.Event.EventHandler looperEndDelegate = sender => loopDictionary.Remove(sender); + private static readonly Core.Event.EventHandler looperDelegate = sender => + { + int counter = loopDictionary[sender] = loopDictionary[sender] - 1; + + if (counter <= 0) + { + loopDictionary.Remove(sender); + return; + } + + Tween tweenConcrete = (Tween)sender; + tweenConcrete.Reset(); + tweenConcrete.State = TweenState.Playing; + }; + public static ITween LoopInfinitely(this ITween tween) { tween.OnCompleted.AddListener(repeaterDelegate);