Browse Source

Renamed HasNewFrame and added RenderTimeCriticalContent for visuals that don't need the time feature all the time.

pull/2185/head
Nikita Tsukanov 7 years ago
parent
commit
319e99d1c1
  1. 3
      samples/ControlCatalog/Pages/TimeCriticalRenderPage.cs
  2. 4
      src/Avalonia.Visuals/Rendering/DeferredRenderer.cs
  3. 4
      src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs
  4. 2
      src/Avalonia.Visuals/Rendering/SceneGraph/SceneBuilder.cs
  5. 3
      src/Avalonia.Visuals/VisualTree/IRenderTimeCriticalVisual.cs

3
samples/ControlCatalog/Pages/TimeCriticalRenderPage.cs

@ -15,7 +15,8 @@ namespace ControlCatalog.Pages
private TimeSpan _lastFps;
private int _lastFpsFrame;
private double _fps;
public bool HasNewFrame => true;
public bool HasRenderTimeCriticalContent => true;
public bool ThreadSafeHasNewFrame => true;
Stopwatch _st = Stopwatch.StartNew();
private Typeface _typeface = Typeface.Default;

4
src/Avalonia.Visuals/Rendering/DeferredRenderer.cs

@ -301,7 +301,7 @@ namespace Avalonia.Rendering
}
var hasCriticalRenderTimeVisualUpdates = Layers.Any(l =>
l.LayerRoot is IRenderTimeCriticalVisual critical && critical.HasNewFrame);
l.LayerRoot is IRenderTimeCriticalVisual critical && critical.ThreadSafeHasNewFrame);
if (hasCriticalRenderTimeVisualUpdates)
{
Layers.Update(scene, contextFactory());
@ -372,7 +372,7 @@ namespace Avalonia.Rendering
var renderTarget = renderLayer.Bitmap;
var node = (VisualNode)scene.FindNode(layer.LayerRoot);
var critical = node.Visual as IRenderTimeCriticalVisual;
if (criticalTimeRenderOnly && critical?.HasNewFrame != true)
if (criticalTimeRenderOnly && critical?.ThreadSafeHasNewFrame != true)
continue;
if (node != null)

4
src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs

@ -300,7 +300,7 @@ namespace Avalonia.Rendering
using (visual.OpacityMask != null ? context.PushOpacityMask(visual.OpacityMask, bounds) : default(DrawingContext.PushedState))
using (context.PushTransformContainer())
{
if (visual is IRenderTimeCriticalVisual critical)
if (visual is IRenderTimeCriticalVisual critical && critical.HasRenderTimeCriticalContent)
{
critical.ThreadSafeRender(context, bounds.Size, scaling);
info?.RenderTimeCriticalVisuals.Add(critical);
@ -337,7 +337,7 @@ namespace Avalonia.Rendering
}
}
public bool NeedsUpdate => _lastRenderPassInfo?.RenderTimeCriticalVisuals.Any(v => v.HasNewFrame) == true;
public bool NeedsUpdate => _lastRenderPassInfo?.RenderTimeCriticalVisuals.Any(v => v.ThreadSafeHasNewFrame) == true;
public void Update(TimeSpan time) => _root.InvalidateVisual();
public void Render()
{

2
src/Avalonia.Visuals/Rendering/SceneGraph/SceneBuilder.cs

@ -368,7 +368,7 @@ namespace Avalonia.Rendering.SceneGraph
private static bool ShouldStartLayer(IVisual visual)
{
if (visual is IRenderTimeCriticalVisual)
if (visual is IRenderTimeCriticalVisual critical && critical.HasRenderTimeCriticalContent)
return true;
if (visual.WantsLayer)
return true;

3
src/Avalonia.Visuals/VisualTree/IRenderTimeCriticalVisual.cs

@ -4,7 +4,8 @@ namespace Avalonia.VisualTree
{
public interface IRenderTimeCriticalVisual
{
bool HasNewFrame { get; }
bool HasRenderTimeCriticalContent { get; }
bool ThreadSafeHasNewFrame { get; }
void ThreadSafeRender(DrawingContext context, Size logicalSize, double scaling);
}
}

Loading…
Cancel
Save