Browse Source

Use weak CompositionVisual reference in server-side

pull/21310/head
Steven He 5 months ago
parent
commit
fa6b049def
  1. 7
      src/Avalonia.Base/Rendering/Composition/CompositionTarget.cs
  2. 11
      src/Avalonia.Base/Rendering/Composition/Server/ReadbackIndices.cs
  3. 2
      src/Avalonia.Base/Rendering/Composition/Server/ServerCompositionVisual/ServerCompositionVisual.cs
  4. 2
      src/Avalonia.Base/Rendering/Composition/Visual.cs

7
src/Avalonia.Base/Rendering/Composition/CompositionTarget.cs

@ -52,10 +52,13 @@ namespace Avalonia.Rendering.Composition
return res; return res;
} }
private static void ProcessHitTestReadbackUpdates(IReadOnlyList<CompositionVisual> readbackUpdates) private static void ProcessHitTestReadbackUpdates(IReadOnlyList<WeakReference<CompositionVisual>> readbackUpdates)
{ {
foreach (var visual in readbackUpdates) foreach (var weakVisual in readbackUpdates)
{ {
if (!weakVisual.TryGetTarget(out var visual))
continue;
if (visual.Parent is CompositionContainerVisual parent) if (visual.Parent is CompositionContainerVisual parent)
parent.UpdateHitTestChildBounds(visual); parent.UpdateHitTestChildBounds(visual);
} }

11
src/Avalonia.Base/Rendering/Composition/Server/ReadbackIndices.cs

@ -1,3 +1,4 @@
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading; using System.Threading;
@ -16,11 +17,11 @@ namespace Avalonia.Rendering.Composition.Server
private ulong _nextWriteRevision = 1; private ulong _nextWriteRevision = 1;
public ulong WriteRevision { get; private set; } public ulong WriteRevision { get; private set; }
public ulong LastCompletedWrite { get; private set; } public ulong LastCompletedWrite { get; private set; }
private readonly HashSet<CompositionVisual> _pendingHitTestUpdateSet = new(); private readonly HashSet<WeakReference<CompositionVisual>> _pendingHitTestUpdateSet = new();
private List<CompositionVisual> _pendingHitTestUpdates = new(); private List<WeakReference<CompositionVisual>> _pendingHitTestUpdates = new();
private List<CompositionVisual> _readHitTestUpdates = new(); private List<WeakReference<CompositionVisual>> _readHitTestUpdates = new();
public IReadOnlyList<CompositionVisual> NextRead() public IReadOnlyList<WeakReference<CompositionVisual>> NextRead()
{ {
lock (_lock) lock (_lock)
{ {
@ -49,7 +50,7 @@ namespace Avalonia.Rendering.Composition.Server
Monitor.Exit(_lock); Monitor.Exit(_lock);
} }
internal void AddHitTestUpdate(CompositionVisual? visual) internal void AddHitTestUpdate(WeakReference<CompositionVisual>? visual)
{ {
if (visual != null && _pendingHitTestUpdateSet.Add(visual)) if (visual != null && _pendingHitTestUpdateSet.Add(visual))
_pendingHitTestUpdates.Add(visual); _pendingHitTestUpdates.Add(visual);

2
src/Avalonia.Base/Rendering/Composition/Server/ServerCompositionVisual/ServerCompositionVisual.cs

@ -20,7 +20,7 @@ namespace Avalonia.Rendering.Composition.Server
{ {
public ServerCompositionVisualCollection? Children { get; private set; } = null!; public ServerCompositionVisualCollection? Children { get; private set; } = null!;
public ServerCompositionVisualCache? Cache { get; private set; } public ServerCompositionVisualCache? Cache { get; private set; }
internal CompositionVisual? Client { get; set; } internal WeakReference<CompositionVisual>? Client { get; set; }
partial void OnRootChanging() partial void OnRootChanging()
{ {

2
src/Avalonia.Base/Rendering/Composition/Visual.cs

@ -22,7 +22,7 @@ namespace Avalonia.Rendering.Composition
partial void InitializeDefaultsExtra() partial void InitializeDefaultsExtra()
{ {
Server.Client = this; Server.Client = new WeakReference<CompositionVisual>(this);
} }
partial void OnRootChanged() => OnRootChangedCore(); partial void OnRootChanged() => OnRootChangedCore();

Loading…
Cancel
Save