From 276afe4271cc7e95bf182bd0589eaa0bd27709f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dariusz=20Komosi=C5=84ski?= Date: Thu, 14 Apr 2022 19:12:44 +0200 Subject: [PATCH] Reduce allocations when creating weak event subscribers. --- .../Utilities/IWeakEventSubscriber.cs | 21 +++++++++++++++++-- src/Avalonia.Base/Visual.cs | 12 +++++------ 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/Avalonia.Base/Utilities/IWeakEventSubscriber.cs b/src/Avalonia.Base/Utilities/IWeakEventSubscriber.cs index 57060853c8..6cf8c605a7 100644 --- a/src/Avalonia.Base/Utilities/IWeakEventSubscriber.cs +++ b/src/Avalonia.Base/Utilities/IWeakEventSubscriber.cs @@ -11,7 +11,7 @@ public interface IWeakEventSubscriber where TEventArgs : EventArg void OnEvent(object? sender, WeakEvent ev, TEventArgs e); } -public class WeakEventSubscriber : IWeakEventSubscriber where TEventArgs : EventArgs +public sealed class WeakEventSubscriber : IWeakEventSubscriber where TEventArgs : EventArgs { public event Action? Event; @@ -19,4 +19,21 @@ public class WeakEventSubscriber : IWeakEventSubscriber { Event?.Invoke(sender, ev, e); } -} \ No newline at end of file +} + +public sealed class TargetWeakEventSubscriber : IWeakEventSubscriber where TEventArgs : EventArgs +{ + private readonly TTarget _target; + private readonly Action _dispatchFunc; + + public TargetWeakEventSubscriber(TTarget target, Action dispatchFunc) + { + _target = target; + _dispatchFunc = dispatchFunc; + } + + void IWeakEventSubscriber.OnEvent(object? sender, WeakEvent ev, TEventArgs e) + { + _dispatchFunc(_target, sender, ev, e); + } +} diff --git a/src/Avalonia.Base/Visual.cs b/src/Avalonia.Base/Visual.cs index e25cb854cf..4fd21f02f9 100644 --- a/src/Avalonia.Base/Visual.cs +++ b/src/Avalonia.Base/Visual.cs @@ -108,7 +108,7 @@ namespace Avalonia private IRenderRoot? _visualRoot; private IVisual? _visualParent; private bool _hasMirrorTransform; - private WeakEventSubscriber? _affectsRenderWeakSubscriber; + private TargetWeakEventSubscriber? _affectsRenderWeakSubscriber; /// /// Initializes static members of the class. @@ -383,11 +383,11 @@ namespace Avalonia { if (sender._affectsRenderWeakSubscriber == null) { - sender._affectsRenderWeakSubscriber = new WeakEventSubscriber(); - sender._affectsRenderWeakSubscriber.Event += delegate - { - sender.InvalidateVisual(); - }; + sender._affectsRenderWeakSubscriber = new TargetWeakEventSubscriber( + sender, static (target, _, _, _) => + { + target.InvalidateVisual(); + }); } InvalidatedWeakEvent.Subscribe(newValue, sender._affectsRenderWeakSubscriber); }