Browse Source

Actually ask render time critical visuals that they have a new frame

pull/2185/head
Nikita Tsukanov 7 years ago
parent
commit
d1d4561c31
  1. 27
      src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs

27
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<IRenderTimeCriticalVisual> RenderTimeCriticalVisuals { get; } =
new List<IRenderTimeCriticalVisual>();
}
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()
{

Loading…
Cancel
Save