Browse Source

[RENDER] Don't copy "resized" layer contents + properly remove unneded layers

pull/2011/head
Nikita Tsukanov 7 years ago
parent
commit
37c65262ac
  1. 33
      src/Avalonia.Visuals/Rendering/DeferredRenderer.cs
  2. 12
      src/Avalonia.Visuals/Rendering/RenderLayer.cs
  3. 6
      src/Avalonia.Visuals/Rendering/RenderLayers.cs

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

@ -336,16 +336,34 @@ namespace Avalonia.Rendering
private void RenderToLayers(Scene scene)
{
if (scene.Layers.HasDirty)
foreach (var layer in scene.Layers)
{
foreach (var layer in scene.Layers)
{
var renderTarget = Layers[layer.LayerRoot].Bitmap;
var node = (VisualNode)scene.FindNode(layer.LayerRoot);
var renderLayer = Layers[layer.LayerRoot];
if (layer.Dirty.IsEmpty && !renderLayer.IsEmpty)
continue;
var renderTarget = renderLayer.Bitmap;
var node = (VisualNode)scene.FindNode(layer.LayerRoot);
if (node != null)
if (node != null)
{
using (var context = renderTarget.Item.CreateDrawingContext(this))
{
using (var context = renderTarget.Item.CreateDrawingContext(this))
if (renderLayer.IsEmpty)
{
// Render entire layer root node
context.Clear(Colors.Transparent);
context.Transform = Matrix.Identity;
context.PushClip(node.ClipBounds);
Render(context, node, layer.LayerRoot, node.ClipBounds);
context.PopClip();
if (DrawDirtyRects)
{
_dirtyRectsDisplay.Add(node.ClipBounds);
}
renderLayer.IsEmpty = false;
}
else
{
foreach (var rect in layer.Dirty)
{
@ -364,6 +382,7 @@ namespace Avalonia.Rendering
}
}
}
}
private void RenderOverlay(Scene scene, IDrawingContextImpl parentContent)

12
src/Avalonia.Visuals/Rendering/RenderLayer.cs

@ -7,39 +7,39 @@ namespace Avalonia.Rendering
{
public class RenderLayer
{
private readonly IDrawingContextImpl _drawingContext;
public RenderLayer(
IDrawingContextImpl drawingContext,
Size size,
double scaling,
IVisual layerRoot)
{
_drawingContext = drawingContext;
Bitmap = RefCountable.Create(drawingContext.CreateLayer(size));
Size = size;
Scaling = scaling;
LayerRoot = layerRoot;
IsEmpty = true;
}
public IRef<IRenderTargetBitmapImpl> Bitmap { get; private set; }
public bool IsEmpty { get; set; }
public double Scaling { get; private set; }
public Size Size { get; private set; }
public IVisual LayerRoot { get; }
public void ResizeBitmap(Size size, double scaling)
public void RecreateBitmap(IDrawingContextImpl drawingContext, Size size, double scaling)
{
if (Size != size || Scaling != scaling)
{
var resized = RefCountable.Create(_drawingContext.CreateLayer(size));
var resized = RefCountable.Create(drawingContext.CreateLayer(size));
using (var context = resized.Item.CreateDrawingContext(null))
{
context.Clear(Colors.Transparent);
context.DrawImage(Bitmap, 1, new Rect(Size), new Rect(Size));
Bitmap.Dispose();
Bitmap = resized;
Scaling = scaling;
Size = size;
IsEmpty = true;
}
}
}

6
src/Avalonia.Visuals/Rendering/RenderLayers.cs

@ -29,11 +29,11 @@ namespace Avalonia.Rendering
}
else
{
layer.ResizeBitmap(scene.Size, scene.Scaling);
layer.RecreateBitmap(context, scene.Size, scene.Scaling);
}
}
for (var i = _inner.Count - 1; i >= 0; --i)
for (var i = 0; i < _inner.Count;)
{
var layer = _inner[i];
@ -43,6 +43,8 @@ namespace Avalonia.Rendering
_inner.RemoveAt(i);
_index.Remove(layer.LayerRoot);
}
else
i++;
}
}

Loading…
Cancel
Save