diff --git a/src/Avalonia.Visuals/Rendering/DeferredRenderer.cs b/src/Avalonia.Visuals/Rendering/DeferredRenderer.cs index 606eafac50..cca1545a29 100644 --- a/src/Avalonia.Visuals/Rendering/DeferredRenderer.cs +++ b/src/Avalonia.Visuals/Rendering/DeferredRenderer.cs @@ -6,7 +6,6 @@ using Avalonia.Rendering.SceneGraph; using Avalonia.Threading; using Avalonia.VisualTree; using System.Collections.Generic; -using System.Collections.Concurrent; namespace Avalonia.Rendering { @@ -144,10 +143,12 @@ namespace Avalonia.Rendering dirtyRects.Coalesce(); } + var empty = dirtyRects.IsEmpty; + lock (_scene) { _scene = scene; - _dirtyRects = dirtyRects; + _dirtyRects = empty ? null : dirtyRects; } _dirty.Clear(); @@ -166,7 +167,7 @@ namespace Avalonia.Rendering return; } - if (!_updateQueued && (_dirty == null || _dirty.Count > 0)) + if (!_updateQueued && (_dirty == null || _dirty.Count > 0 || _dirtyRects != null)) { Dispatcher.UIThread.InvokeAsync(UpdateScene, DispatcherPriority.Render); _updateQueued = true; @@ -183,41 +184,41 @@ namespace Avalonia.Rendering dirtyRects = _dirtyRects; } - if (dirtyRects != null) + try { if (_renderTarget == null) { _renderTarget = _root.CreateRenderTarget(); } - try + using (var context = _renderTarget.CreateDrawingContext()) { - _totalFrames++; + int updateCount = 0; - int count = 0; + _totalFrames++; - using (var context = _renderTarget.CreateDrawingContext()) + if (dirtyRects != null) { foreach (var rect in dirtyRects) { context.PushClip(rect); Render(context, _scene.Root, rect); context.PopClip(); - ++count; + ++updateCount; } + } - if (DrawFps) - { - RenderFps(context, count); - } + if (DrawFps) + { + RenderFps(context, updateCount); } } - catch (RenderTargetCorruptedException ex) - { - Logging.Logger.Information("Renderer", this, "Render target was corrupted. Exception: {0}", ex); - _renderTarget.Dispose(); - _renderTarget = null; - } + } + catch (RenderTargetCorruptedException ex) + { + Logging.Logger.Information("Renderer", this, "Render target was corrupted. Exception: {0}", ex); + _renderTarget.Dispose(); + _renderTarget = null; } _rendering = false; diff --git a/src/Avalonia.Visuals/Rendering/DirtyRects.cs b/src/Avalonia.Visuals/Rendering/DirtyRects.cs index cb10714f5a..67ec1b0c48 100644 --- a/src/Avalonia.Visuals/Rendering/DirtyRects.cs +++ b/src/Avalonia.Visuals/Rendering/DirtyRects.cs @@ -11,6 +11,8 @@ namespace Avalonia.Rendering { private List _rects = new List(); + public bool IsEmpty => _rects.Count == 0; + public void Add(Rect rect) { if (!rect.IsEmpty)