瀏覽代碼

Prevent reentrancy in renderer.

Steven Kirk 9 年之前
父節點
當前提交
d9d5e8b6ac
共有 1 個文件被更改,包括 10 次插入0 次删除
  1. 10 0
      src/Avalonia.Visuals/Rendering/DeferredRenderer.cs

+ 10 - 0
src/Avalonia.Visuals/Rendering/DeferredRenderer.cs

@@ -20,6 +20,7 @@ namespace Avalonia.Rendering
         private ConcurrentQueue<Rect> _renderQueue = new ConcurrentQueue<Rect>();
         private bool _needsUpdate;
         private bool _updateQueued;
+        private bool _rendering;
 
         private readonly Stopwatch _stopwatch = Stopwatch.StartNew();
         private int _totalFrames;
@@ -169,12 +170,19 @@ namespace Avalonia.Rendering
 
         private void OnRenderLoopTick(object sender, EventArgs e)
         {
+            if (_rendering)
+            {
+                return;
+            }
+
             if (_needsUpdate && !_updateQueued)
             {
                 Dispatcher.UIThread.InvokeAsync(UpdateScene, DispatcherPriority.Render);
                 _updateQueued = true;
             }
 
+            _rendering = true;
+
             if (!_renderQueue.IsEmpty)
             {
                 if (_renderTarget == null)
@@ -210,6 +218,8 @@ namespace Avalonia.Rendering
                     _renderTarget = null;
                 }
             }
+
+            _rendering = false;
         }
     }
 }