|
|
@@ -16,9 +16,8 @@ namespace Avalonia.Rendering
|
|
|
private readonly IRenderRoot _root;
|
|
|
private Scene _scene;
|
|
|
private IRenderTarget _renderTarget;
|
|
|
- private List<IVisual> _dirty = new List<IVisual>();
|
|
|
+ private List<IVisual> _dirty;
|
|
|
private DirtyRects _dirtyRects;
|
|
|
- private bool _needsUpdate;
|
|
|
private bool _updateQueued;
|
|
|
private bool _rendering;
|
|
|
|
|
|
@@ -46,14 +45,7 @@ namespace Avalonia.Rendering
|
|
|
|
|
|
public void AddDirty(IVisual visual)
|
|
|
{
|
|
|
- // If the root of the scene has no children, then the scene is being set up; don't
|
|
|
- // bother filling the dirty list with every control in the window.
|
|
|
- if (_scene.Root.Children.Count > 0)
|
|
|
- {
|
|
|
- _dirty.Add(visual);
|
|
|
- }
|
|
|
-
|
|
|
- _needsUpdate = true;
|
|
|
+ _dirty?.Add(visual);
|
|
|
}
|
|
|
|
|
|
public void Dispose()
|
|
|
@@ -66,7 +58,7 @@ namespace Avalonia.Rendering
|
|
|
|
|
|
public IEnumerable<IVisual> HitTest(Point p, Func<IVisual, bool> filter)
|
|
|
{
|
|
|
- if (_renderLoop == null && _needsUpdate)
|
|
|
+ if (_renderLoop == null && (_dirty == null || _dirty.Count > 0))
|
|
|
{
|
|
|
// When unit testing the renderLoop may be null, so update the scene manually.
|
|
|
UpdateScene();
|
|
|
@@ -136,7 +128,13 @@ namespace Avalonia.Rendering
|
|
|
var scene = _scene.Clone();
|
|
|
var dirtyRects = new DirtyRects();
|
|
|
|
|
|
- if (_dirty.Count > 0)
|
|
|
+ if (_dirty == null)
|
|
|
+ {
|
|
|
+ _dirty = new List<IVisual>();
|
|
|
+ SceneBuilder.UpdateAll(scene);
|
|
|
+ dirtyRects.Add(new Rect(_root.ClientSize));
|
|
|
+ }
|
|
|
+ else if (_dirty.Count > 0)
|
|
|
{
|
|
|
foreach (var visual in _dirty)
|
|
|
{
|
|
|
@@ -145,11 +143,6 @@ namespace Avalonia.Rendering
|
|
|
|
|
|
dirtyRects.Coalesce();
|
|
|
}
|
|
|
- else
|
|
|
- {
|
|
|
- SceneBuilder.UpdateAll(scene);
|
|
|
- dirtyRects.Add(new Rect(_root.ClientSize));
|
|
|
- }
|
|
|
|
|
|
lock (_scene)
|
|
|
{
|
|
|
@@ -158,7 +151,6 @@ namespace Avalonia.Rendering
|
|
|
}
|
|
|
|
|
|
_dirty.Clear();
|
|
|
- _needsUpdate = false;
|
|
|
_root.Invalidate(new Rect(_root.ClientSize));
|
|
|
}
|
|
|
finally
|
|
|
@@ -174,7 +166,7 @@ namespace Avalonia.Rendering
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- if (_needsUpdate && !_updateQueued)
|
|
|
+ if (!_updateQueued && (_dirty == null || _dirty.Count > 0))
|
|
|
{
|
|
|
Dispatcher.UIThread.InvokeAsync(UpdateScene, DispatcherPriority.Render);
|
|
|
_updateQueued = true;
|