Browse Source

enable updates if there's a visual with render critical timing on it.

try-critical-branch-bringup-2
Jumar Macato 5 years ago
parent
commit
3d5d137753
No known key found for this signature in database GPG Key ID: B19884DAC3A5BF3F
  1. 9
      samples/ControlCatalog/Pages/TimeCriticalRenderPage.cs
  2. 3
      src/Avalonia.Visuals/Rendering/DeferredRenderer.cs
  3. 12
      src/Avalonia.Visuals/Rendering/SceneGraph/Scene.cs
  4. 20
      src/Avalonia.Visuals/Rendering/SceneGraph/SceneBuilder.cs

9
samples/ControlCatalog/Pages/TimeCriticalRenderPage.cs

@ -21,7 +21,7 @@ namespace ControlCatalog.Pages
private Typeface _typeface = Typeface.Default;
public void ThreadSafeRender(DrawingContext context, Size logicalSize, double scaling)
public override void Render(DrawingContext context)
{
var nowTs = _st.Elapsed;
var now = DateTime.Now;
@ -43,9 +43,14 @@ namespace ControlCatalog.Pages
};
var back = new ImmutableSolidColorBrush(Colors.LightGray);
var textBrush = new ImmutableSolidColorBrush(Colors.Black);
context.FillRectangle(back, new Rect(logicalSize));
context.FillRectangle(back, new Rect(0,0,12,12));
context.DrawText(textBrush, new Point(5, 5), fmt);
_frame++;
}
public void ThreadSafeRender(DrawingContext context, Size logicalSize, double scaling)
{
}
}
}

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

@ -250,7 +250,7 @@ namespace Avalonia.Rendering
}
}
bool NeedsUpdate => _dirty == null || _dirty.Count > 0;
private bool NeedsUpdate => _dirty == null || _dirty.Count > 0 || (_scene?.Item?.HasCriticalVisual ?? false);
bool IRenderLoopTask.NeedsUpdate => NeedsUpdate;
void IRenderLoopTask.Update(TimeSpan time) => UpdateScene();
@ -631,6 +631,7 @@ namespace Avalonia.Rendering
foreach (var visual in _recalculateChildren)
{
var node = scene.FindNode(visual);
((VisualNode)node)?.SortChildren(scene);
}

12
src/Avalonia.Visuals/Rendering/SceneGraph/Scene.cs

@ -25,12 +25,14 @@ namespace Avalonia.Rendering.SceneGraph
new VisualNode(rootVisual, null),
new Dictionary<IVisual, IVisualNode>(),
new SceneLayers(rootVisual),
0)
0,
false)
{
_index.Add(rootVisual, Root);
}
private Scene(VisualNode root, Dictionary<IVisual, IVisualNode> index, SceneLayers layers, int generation)
private Scene(VisualNode root, Dictionary<IVisual, IVisualNode> index, SceneLayers layers, int generation,
bool hasCriticalVisual)
{
Contract.Requires<ArgumentNullException>(root != null);
@ -41,6 +43,7 @@ namespace Avalonia.Rendering.SceneGraph
Layers = layers;
Generation = generation;
root.LayerRoot = root.Visual;
HasCriticalVisual = hasCriticalVisual;
}
public Task Rendered => _rendered.Task;
@ -70,6 +73,9 @@ namespace Avalonia.Rendering.SceneGraph
/// </summary>
public double Scaling { get; set; } = 1;
public bool HasCriticalVisual { get;
set; }
/// <summary>
/// Adds a node to the scene index.
/// </summary>
@ -90,7 +96,7 @@ namespace Avalonia.Rendering.SceneGraph
var index = new Dictionary<IVisual, IVisualNode>(_index.Count);
var root = Clone((VisualNode)Root, null, index);
var result = new Scene(root, index, Layers.Clone(), Generation + 1)
var result = new Scene(root, index, Layers.Clone(), Generation + 1, HasCriticalVisual)
{
Size = Size,
Scaling = Scaling,

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

@ -49,6 +49,11 @@ namespace Avalonia.Rendering.SceneGraph
UpdateSize(scene);
}
if (visual is IRenderTimeCriticalVisual criticalVisual)
{
ForceUpdateCriticalRender(scene, visual);
}
if (visual.VisualRoot == scene.Root.Visual)
{
if (node?.Parent != null &&
@ -298,10 +303,19 @@ namespace Avalonia.Rendering.SceneGraph
}
}
// TODO: Im clueless so im just copying the above method to force a dirty rect.
private void ForceUpdateCriticalRender(Scene scene, IVisual visual)
{
}
private static VisualNode CreateNode(Scene scene, IVisual visual, VisualNode parent)
{
var node = new VisualNode(visual, parent);
node.LayerRoot = parent.LayerRoot;
if (visual is IRenderTimeCriticalVisual)
{
scene.HasCriticalVisual = true;
}
scene.Add(node);
return node;
}
@ -315,6 +329,12 @@ namespace Avalonia.Rendering.SceneGraph
Deindex(scene, visual);
}
}
if (node.Visual is IRenderTimeCriticalVisual)
{
scene.HasCriticalVisual = false;
}
scene.Remove(node);
node.SubTreeUpdated = true;

Loading…
Cancel
Save