From 93396ea6d870aa7eb58e525aaf9b4f127d04507f Mon Sep 17 00:00:00 2001 From: Giuseppe Lippolis Date: Fri, 3 Feb 2023 15:20:51 +0100 Subject: [PATCH 1/3] perf: Animatable small adjust - delegate caching - try to partially avoid changing the Transitions property during subscribe/unsubscribe operations --- src/Avalonia.Base/Animation/Animatable.cs | 32 ++++++++++++++--------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/src/Avalonia.Base/Animation/Animatable.cs b/src/Avalonia.Base/Animation/Animatable.cs index eddb89c3e8..50d9a48e9e 100644 --- a/src/Avalonia.Base/Animation/Animatable.cs +++ b/src/Avalonia.Base/Animation/Animatable.cs @@ -29,6 +29,12 @@ namespace Avalonia.Animation private bool _transitionsEnabled = true; private bool _isSubscribedToTransitionsCollection = false; private Dictionary? _transitionState; + readonly NotifyCollectionChangedEventHandler _collectionChanged; + + public Animatable() + { + _collectionChanged = TransitionsCollectionChanged; + } /// /// Gets or sets the clock which controls the animations on the control. @@ -61,14 +67,14 @@ namespace Avalonia.Animation { _transitionsEnabled = true; - if (Transitions is object) + if (Transitions is Transitions transitions) { if (!_isSubscribedToTransitionsCollection) { _isSubscribedToTransitionsCollection = true; - Transitions.CollectionChanged += TransitionsCollectionChanged; + transitions.CollectionChanged += _collectionChanged; } - AddTransitions(Transitions); + AddTransitions(transitions); } } } @@ -86,14 +92,14 @@ namespace Avalonia.Animation { _transitionsEnabled = false; - if (Transitions is object) + if (Transitions is Transitions transitions) { if (_isSubscribedToTransitionsCollection) { _isSubscribedToTransitionsCollection = false; - Transitions.CollectionChanged -= TransitionsCollectionChanged; + transitions.CollectionChanged -= _collectionChanged; } - RemoveTransitions(Transitions); + RemoveTransitions(transitions); } } } @@ -120,7 +126,7 @@ namespace Avalonia.Animation toAdd = newTransitions.Except(oldTransitions).ToList(); } - newTransitions.CollectionChanged += TransitionsCollectionChanged; + newTransitions.CollectionChanged += _collectionChanged; _isSubscribedToTransitionsCollection = true; AddTransitions(toAdd); } @@ -134,19 +140,19 @@ namespace Avalonia.Animation toRemove = oldTransitions.Except(newTransitions).ToList(); } - oldTransitions.CollectionChanged -= TransitionsCollectionChanged; + oldTransitions.CollectionChanged -= _collectionChanged; RemoveTransitions(toRemove); } } else if (_transitionsEnabled && - Transitions is object && + Transitions is Transitions transitions && _transitionState is object && !change.Property.IsDirect && change.Priority > BindingPriority.Animation) { - for (var i = Transitions.Count -1; i >= 0; --i) + for (var i = transitions.Count - 1; i >= 0; --i) { - var transition = Transitions[i]; + var transition = transitions[i]; if (transition.Property == change.Property && _transitionState.TryGetValue(transition, out var state)) @@ -166,11 +172,11 @@ namespace Avalonia.Animation { oldValue = animatedValue; } - + var clock = Clock ?? AvaloniaLocator.Current.GetRequiredService(); state.Instance?.Dispose(); state.Instance = transition.Apply( this, - Clock ?? AvaloniaLocator.Current.GetRequiredService(), + clock, oldValue, newValue); return; From b1ca75a30b9cda3f91dbd9af4c2d89246d52b66f Mon Sep 17 00:00:00 2001 From: Giuseppe Lippolis Date: Fri, 3 Feb 2023 16:13:12 +0100 Subject: [PATCH 2/3] fix: Address review --- src/Avalonia.Base/Animation/Animatable.cs | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/Avalonia.Base/Animation/Animatable.cs b/src/Avalonia.Base/Animation/Animatable.cs index 50d9a48e9e..6a05dfbe6d 100644 --- a/src/Avalonia.Base/Animation/Animatable.cs +++ b/src/Avalonia.Base/Animation/Animatable.cs @@ -29,12 +29,9 @@ namespace Avalonia.Animation private bool _transitionsEnabled = true; private bool _isSubscribedToTransitionsCollection = false; private Dictionary? _transitionState; - readonly NotifyCollectionChangedEventHandler _collectionChanged; - - public Animatable() - { - _collectionChanged = TransitionsCollectionChanged; - } + private NotifyCollectionChangedEventHandler _collectionChanged; + private NotifyCollectionChangedEventHandler TransitionsCollectionChangedHandler => + _collectionChanged ??= TransitionsCollectionChanged; /// /// Gets or sets the clock which controls the animations on the control. @@ -72,7 +69,7 @@ namespace Avalonia.Animation if (!_isSubscribedToTransitionsCollection) { _isSubscribedToTransitionsCollection = true; - transitions.CollectionChanged += _collectionChanged; + transitions.CollectionChanged += TransitionsCollectionChangedHandler; } AddTransitions(transitions); } @@ -97,7 +94,7 @@ namespace Avalonia.Animation if (_isSubscribedToTransitionsCollection) { _isSubscribedToTransitionsCollection = false; - transitions.CollectionChanged -= _collectionChanged; + transitions.CollectionChanged -= TransitionsCollectionChangedHandler; } RemoveTransitions(transitions); } @@ -126,7 +123,7 @@ namespace Avalonia.Animation toAdd = newTransitions.Except(oldTransitions).ToList(); } - newTransitions.CollectionChanged += _collectionChanged; + newTransitions.CollectionChanged += TransitionsCollectionChangedHandler; _isSubscribedToTransitionsCollection = true; AddTransitions(toAdd); } @@ -140,7 +137,7 @@ namespace Avalonia.Animation toRemove = oldTransitions.Except(newTransitions).ToList(); } - oldTransitions.CollectionChanged -= _collectionChanged; + oldTransitions.CollectionChanged -= TransitionsCollectionChangedHandler; RemoveTransitions(toRemove); } } From 41966d314fe8c0e7d8e82b513e285adfb3379c48 Mon Sep 17 00:00:00 2001 From: workgroupengineering Date: Fri, 3 Feb 2023 16:40:53 +0100 Subject: [PATCH 3/3] fix: Builld --- src/Avalonia.Base/Animation/Animatable.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Avalonia.Base/Animation/Animatable.cs b/src/Avalonia.Base/Animation/Animatable.cs index 6a05dfbe6d..5208c8b218 100644 --- a/src/Avalonia.Base/Animation/Animatable.cs +++ b/src/Avalonia.Base/Animation/Animatable.cs @@ -29,7 +29,7 @@ namespace Avalonia.Animation private bool _transitionsEnabled = true; private bool _isSubscribedToTransitionsCollection = false; private Dictionary? _transitionState; - private NotifyCollectionChangedEventHandler _collectionChanged; + private NotifyCollectionChangedEventHandler? _collectionChanged; private NotifyCollectionChangedEventHandler TransitionsCollectionChangedHandler => _collectionChanged ??= TransitionsCollectionChanged;