Explorar o código

Avoid per-frame allocations in renderer lock.

Dariusz Komosinski %!s(int64=6) %!d(string=hai) anos
pai
achega
a9da85e4ae

+ 24 - 4
src/Avalonia.Visuals/Rendering/ManagedDeferredRendererLock.cs

@@ -1,5 +1,4 @@
 using System;
 using System;
-using System.Reactive.Disposables;
 using System.Threading;
 using System.Threading;
 
 
 namespace Avalonia.Rendering
 namespace Avalonia.Rendering
@@ -7,7 +6,13 @@ namespace Avalonia.Rendering
     public class ManagedDeferredRendererLock : IDeferredRendererLock
     public class ManagedDeferredRendererLock : IDeferredRendererLock
     {
     {
         private readonly object _lock = new object();
         private readonly object _lock = new object();
-        
+        private readonly LockDisposable _lockDisposable;
+
+        public ManagedDeferredRendererLock()
+        {
+            _lockDisposable = new LockDisposable(_lock);
+        }
+
         /// <summary>
         /// <summary>
         /// Tries to lock the target surface or window
         /// Tries to lock the target surface or window
         /// </summary>
         /// </summary>
@@ -15,7 +20,7 @@ namespace Avalonia.Rendering
         public IDisposable TryLock()
         public IDisposable TryLock()
         {
         {
             if (Monitor.TryEnter(_lock))
             if (Monitor.TryEnter(_lock))
-                return Disposable.Create(() => Monitor.Exit(_lock));
+                return _lockDisposable;
             return null;
             return null;
         }
         }
 
 
@@ -25,7 +30,22 @@ namespace Avalonia.Rendering
         public IDisposable Lock()
         public IDisposable Lock()
         {
         {
             Monitor.Enter(_lock);
             Monitor.Enter(_lock);
-            return Disposable.Create(() => Monitor.Exit(_lock));
+            return _lockDisposable;
+        }
+
+        private class LockDisposable : IDisposable
+        {
+            private readonly object _lock;
+
+            public LockDisposable(object @lock)
+            {
+                _lock = @lock;
+            }
+
+            public void Dispose()
+            {
+                Monitor.Exit(_lock);
+            }
         }
         }
     }
     }
 }
 }