Browse Source

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

scenegraph-after-breakage
Steven Kirk 10 years ago
parent
commit
7dde754861
  1. 39
      src/Avalonia.Visuals/Rendering/DeferredRenderer.cs
  2. 2
      src/Avalonia.Visuals/Rendering/DirtyRects.cs

39
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
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)

Loading…
Cancel
Save