diff --git a/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs b/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs index eb5ab36935..05e9db89e5 100644 --- a/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs +++ b/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs @@ -64,7 +64,9 @@ namespace Avalonia.Rendering using (context.PushTransformContainer()) { - _lastRenderPassInfo = Render(context, _root, _root.Bounds, scaling); + var info = new RenderPassInfo(); + Render(context, _root, _root.Bounds, scaling, info); + _lastRenderPassInfo = info; } if (DrawDirtyRects) @@ -251,23 +253,18 @@ namespace Avalonia.Rendering } } - struct RenderPassInfo + class RenderPassInfo { - public bool HasRenderTimeCriticalVisuals { get; set; } - public static RenderPassInfo operator + (RenderPassInfo left, RenderPassInfo right) - { - var rv = left; - rv.HasRenderTimeCriticalVisuals |= right.HasRenderTimeCriticalVisuals; - return rv; - } + public List RenderTimeCriticalVisuals { get; } = + new List(); } - private RenderPassInfo Render(DrawingContext context, IVisual visual, Rect clipRect, double scaling) + private void Render(DrawingContext context, IVisual visual, Rect clipRect, + double scaling, RenderPassInfo info = null) { var opacity = visual.Opacity; var clipToBounds = visual.ClipToBounds; var bounds = new Rect(visual.Bounds.Size); - var info = new RenderPassInfo(); if (visual.IsVisible && opacity > 0) { @@ -306,7 +303,7 @@ namespace Avalonia.Rendering if (visual is IRenderTimeCriticalVisual critical) { critical.ThreadSafeRender(context, bounds.Size, scaling); - info.HasRenderTimeCriticalVisuals = true; + info?.RenderTimeCriticalVisuals.Add(critical); } visual.Render(context); @@ -324,7 +321,7 @@ namespace Avalonia.Rendering if (!child.ClipToBounds || clipRect.Intersects(childBounds)) { var childClipRect = clipRect.Translate(-childBounds.Position); - info += Render(context, child, childClipRect, scaling); + Render(context, child, childClipRect, scaling, info); } else { @@ -338,11 +335,9 @@ namespace Avalonia.Rendering { ClearTransformedBounds(visual); } - - return info; } - public bool NeedsUpdate => _lastRenderPassInfo.HasRenderTimeCriticalVisuals; + public bool NeedsUpdate => _lastRenderPassInfo?.RenderTimeCriticalVisuals.Any(v => v.HasNewFrame) == true; public void Update(TimeSpan time) => _root.InvalidateVisual(); public void Render() {