Browse Source

Merge pull request #5972 from MarchingCube/memory-fixes

Various memory optimizations
pull/5980/head
Dariusz Komosiński 5 years ago
committed by GitHub
parent
commit
45b02810b8
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 7
      src/Avalonia.Visuals/Rendering/SceneGraph/DeferredDrawingContextImpl.cs
  2. 2
      src/Avalonia.Visuals/Rendering/SceneGraph/RectangleNode.cs
  3. 30
      src/Avalonia.Visuals/Rendering/SceneGraph/SceneBuilder.cs
  4. 7
      src/Avalonia.Visuals/Rendering/SceneGraph/VisualNode.cs
  5. 4
      src/Avalonia.Visuals/Rendering/ZIndexComparer.cs

7
src/Avalonia.Visuals/Rendering/SceneGraph/DeferredDrawingContextImpl.cs

@ -408,9 +408,12 @@ namespace Avalonia.Rendering.SceneGraph
var dirty = Owner.Layers.GetOrAdd(Owner._node.LayerRoot).Dirty;
foreach (var operation in Owner._node.DrawOperations)
var drawOperations = Owner._node.DrawOperations;
var drawOperationsCount = drawOperations.Count;
for (var i = 0; i < drawOperationsCount; i++)
{
dirty.Add(operation.Item.Bounds);
dirty.Add(drawOperations[i].Item.Bounds);
}
Owner._node = Node;

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

@ -84,7 +84,7 @@ namespace Avalonia.Rendering.SceneGraph
return transform == Transform &&
Equals(brush, Brush) &&
Equals(Pen, pen) &&
Media.BoxShadows.Equals(BoxShadows, boxShadows) &&
BoxShadows.Equals(boxShadows) &&
rect.Equals(Rect);
}

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

@ -1,5 +1,5 @@
using System;
using System.Linq;
using System.Collections.Generic;
using Avalonia.Media;
using Avalonia.Platform;
using Avalonia.Threading;
@ -247,11 +247,26 @@ namespace Avalonia.Rendering.SceneGraph
if (forceRecurse)
{
foreach (var child in visual.VisualChildren.OrderBy(x => x, ZIndexComparer.Instance))
var visualChildren = (IList<IVisual>) visual.VisualChildren;
if (visualChildren.Count == 1)
{
var childNode = GetOrCreateChildNode(scene, child, node);
var childNode = GetOrCreateChildNode(scene, visualChildren[0], node);
Update(context, scene, (VisualNode)childNode, clip, forceRecurse);
}
else if (visualChildren.Count > 1)
{
var sortedChildren = new IVisual[visualChildren.Count];
visualChildren.CopyTo(sortedChildren, 0);
Array.Sort(sortedChildren, ZIndexComparer.ComparisonInstance);
foreach (var child in sortedChildren)
{
var childNode = GetOrCreateChildNode(scene, child, node);
Update(context, scene, (VisualNode)childNode, clip, forceRecurse);
}
}
node.SubTreeUpdated = true;
contextImpl.TrimChildren();
@ -308,13 +323,17 @@ namespace Avalonia.Rendering.SceneGraph
private static void Deindex(Scene scene, VisualNode node)
{
foreach (VisualNode child in node.Children)
var nodeChildren = node.Children;
var nodeChildrenCount = nodeChildren.Count;
for (var i = 0; i < nodeChildrenCount; i++)
{
if (child is VisualNode visual)
if (nodeChildren[i] is VisualNode visual)
{
Deindex(scene, visual);
}
}
scene.Remove(node);
node.SubTreeUpdated = true;
@ -323,7 +342,6 @@ namespace Avalonia.Rendering.SceneGraph
node.Visual.TransformedBounds = null;
if (node.LayerRoot == node.Visual && node.Visual != scene.Root.Visual)
{
scene.Layers.Remove(node.LayerRoot);

7
src/Avalonia.Visuals/Rendering/SceneGraph/VisualNode.cs

@ -365,9 +365,12 @@ namespace Avalonia.Rendering.SceneGraph
{
var result = new Rect();
foreach (var operation in DrawOperations)
if (_drawOperations != null)
{
result = result.Union(operation.Item.Bounds);
foreach (var operation in _drawOperations)
{
result = result.Union(operation.Item.Bounds);
}
}
_bounds = result;

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

@ -1,4 +1,5 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using Avalonia.VisualTree;
namespace Avalonia.Rendering
@ -6,6 +7,7 @@ namespace Avalonia.Rendering
public class ZIndexComparer : IComparer<IVisual>
{
public static readonly ZIndexComparer Instance = new ZIndexComparer();
public static readonly Comparison<IVisual> ComparisonInstance = Instance.Compare;
public int Compare(IVisual x, IVisual y) => (x?.ZIndex ?? 0).CompareTo(y?.ZIndex ?? 0);
}

Loading…
Cancel
Save