Browse Source

Don't keep rendering when there's nothing to render.

Steven Kirk 9 years ago
parent
commit
7dde754861

+ 20 - 19
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;

+ 2 - 0
src/Avalonia.Visuals/Rendering/DirtyRects.cs

@@ -11,6 +11,8 @@ namespace Avalonia.Rendering
     {
         private List<Rect> _rects = new List<Rect>();
 
+        public bool IsEmpty => _rects.Count == 0;
+
         public void Add(Rect rect)
         {
             if (!rect.IsEmpty)