Browse Source

Create DiagnosticTextRenderer lazily (#20766)

pull/19747/merge
Julien Lebosquain 3 weeks ago
committed by GitHub
parent
commit
bddc82424c
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 2
      Directory.Packages.props
  2. 2
      src/Avalonia.Base/Rendering/Composition/Compositor.Factories.cs
  3. 17
      src/Avalonia.Base/Rendering/Composition/Compositor.cs
  4. 30
      src/Avalonia.Base/Rendering/Composition/Server/CompositionTargetOverlays.cs
  5. 5
      src/Avalonia.Base/Rendering/Composition/Server/ServerCompositionTarget.cs

2
Directory.Packages.props

@ -7,7 +7,7 @@
<PackageVersion Include="Appium.WebDriver" Version="5.2.0" /> <PackageVersion Include="Appium.WebDriver" Version="5.2.0" />
<PackageVersion Include="Avalonia.Angle.Windows.Natives" Version="2.1.25547.20250602" /> <PackageVersion Include="Avalonia.Angle.Windows.Natives" Version="2.1.25547.20250602" />
<PackageVersion Include="Avalonia.BuildServices" Version="11.3.2" /> <PackageVersion Include="Avalonia.BuildServices" Version="11.3.2" />
<PackageVersion Include="AvaloniaUI.DiagnosticsSupport" Version="2.1.1" /> <PackageVersion Include="AvaloniaUI.DiagnosticsSupport" Version="2.2.0-beta2" />
<PackageVersion Include="BenchmarkDotNet" Version="0.15.6" /> <PackageVersion Include="BenchmarkDotNet" Version="0.15.6" />
<PackageVersion Include="CommunityToolkit.Mvvm" Version="8.4.0" /> <PackageVersion Include="CommunityToolkit.Mvvm" Version="8.4.0" />
<PackageVersion Include="Dotnet.Bundle" Version="0.9.13" /> <PackageVersion Include="Dotnet.Bundle" Version="0.9.13" />

2
src/Avalonia.Base/Rendering/Composition/Compositor.Factories.cs

@ -14,7 +14,7 @@ public partial class Compositor
/// <returns></returns> /// <returns></returns>
internal CompositionTarget CreateCompositionTarget(Func<IEnumerable<object>> surfaces) internal CompositionTarget CreateCompositionTarget(Func<IEnumerable<object>> surfaces)
{ {
return new CompositionTarget(this, new ServerCompositionTarget(_server, surfaces, DiagnosticTextRenderer)); return new CompositionTarget(this, new ServerCompositionTarget(_server, surfaces));
} }
public CompositionContainerVisual CreateContainerVisual() => new(this, new ServerCompositionContainerVisual(_server)); public CompositionContainerVisual CreateContainerVisual() => new(this, new ServerCompositionContainerVisual(_server));

17
src/Avalonia.Base/Rendering/Composition/Compositor.cs

@ -37,29 +37,12 @@ namespace Avalonia.Rendering.Composition
private readonly object _pendingBatchLock = new(); private readonly object _pendingBatchLock = new();
private readonly List<Action> _pendingServerCompositorJobs = new(); private readonly List<Action> _pendingServerCompositorJobs = new();
private readonly List<Action> _pendingServerCompositorPostTargetJobs = new(); private readonly List<Action> _pendingServerCompositorPostTargetJobs = new();
private DiagnosticTextRenderer? _diagnosticTextRenderer;
private readonly Action _triggerCommitRequested; private readonly Action _triggerCommitRequested;
internal IEasing DefaultEasing { get; } internal IEasing DefaultEasing { get; }
internal Dispatcher Dispatcher { get; } internal Dispatcher Dispatcher { get; }
private DiagnosticTextRenderer? DiagnosticTextRenderer
{
get
{
if (_diagnosticTextRenderer == null)
{
// We are running in some unit test context
if (AvaloniaLocator.Current.GetService<IFontManagerImpl>() == null)
return null;
_diagnosticTextRenderer = new(Typeface.Default.GlyphTypeface, 12.0);
}
return _diagnosticTextRenderer;
}
}
internal event Action? AfterCommit; internal event Action? AfterCommit;

30
src/Avalonia.Base/Rendering/Composition/Server/CompositionTargetOverlays.cs

@ -17,20 +17,16 @@ internal class CompositionTargetOverlays
private Rect? _oldFpsCounterRect; private Rect? _oldFpsCounterRect;
private long _updateStarted; private long _updateStarted;
private readonly ServerCompositionTarget _target; private readonly ServerCompositionTarget _target;
private readonly DiagnosticTextRenderer? _diagnosticTextRenderer;
public CompositionTargetOverlays( public CompositionTargetOverlays(ServerCompositionTarget target)
ServerCompositionTarget target,
DiagnosticTextRenderer? diagnosticTextRenderer)
{ {
_target = target; _target = target;
_diagnosticTextRenderer = diagnosticTextRenderer;
} }
private RendererDebugOverlays DebugOverlays { get; set; } private RendererDebugOverlays DebugOverlays { get; set; }
private FpsCounter? FpsCounter private FpsCounter? FpsCounter
=> _fpsCounter ??= _diagnosticTextRenderer != null ? new FpsCounter(_diagnosticTextRenderer) : null; => _fpsCounter ??= DiagnosticTextRenderer is { } diagnosticTextRenderer ? new FpsCounter(diagnosticTextRenderer) : null;
private FrameTimeGraph? LayoutTimeGraph private FrameTimeGraph? LayoutTimeGraph
=> _layoutTimeGraph ??= CreateTimeGraph("Layout"); => _layoutTimeGraph ??= CreateTimeGraph("Layout");
@ -44,15 +40,29 @@ internal class CompositionTargetOverlays
private FrameTimeGraph? UpdateTimeGraph private FrameTimeGraph? UpdateTimeGraph
=> _updateTimeGraph ??= CreateTimeGraph("TUpdate"); => _updateTimeGraph ??= CreateTimeGraph("TUpdate");
private DiagnosticTextRenderer? DiagnosticTextRenderer
{
get
{
if (field is null)
{
// We are running in some unit test context
if (AvaloniaLocator.Current.GetService<IFontManagerImpl>() == null)
return null;
field = new DiagnosticTextRenderer(Typeface.Default.GlyphTypeface, 12.0);
}
return field;
}
}
public bool RequireLayer => DebugOverlays.HasAnyFlag(RendererDebugOverlays.DirtyRects); public bool RequireLayer => DebugOverlays.HasAnyFlag(RendererDebugOverlays.DirtyRects);
private FrameTimeGraph? CreateTimeGraph(string title) private FrameTimeGraph? CreateTimeGraph(string title)
{ {
if (_diagnosticTextRenderer == null) if (DiagnosticTextRenderer is not { } diagnosticTextRenderer)
return null; return null;
return new FrameTimeGraph(360, new Size(360.0, 64.0), 1000.0 / 60.0, title, _diagnosticTextRenderer); return new FrameTimeGraph(360, new Size(360.0, 64.0), 1000.0 / 60.0, title, diagnosticTextRenderer);
} }
@ -73,6 +83,8 @@ internal class CompositionTargetOverlays
if ((DebugOverlays & RendererDebugOverlays.RenderTimeGraph) == 0) if ((DebugOverlays & RendererDebugOverlays.RenderTimeGraph) == 0)
{ {
_renderTimeGraph?.Reset(); _renderTimeGraph?.Reset();
_compositorUpdateTimeGraph?.Reset();
_updateTimeGraph?.Reset();
} }
} }
@ -170,4 +182,4 @@ internal class CompositionTargetOverlays
LayoutTimeGraph?.AddFrameValue(lastLayoutPassTiming.Elapsed.TotalMilliseconds); LayoutTimeGraph?.AddFrameValue(lastLayoutPassTiming.Elapsed.TotalMilliseconds);
} }
} }
} }

5
src/Avalonia.Base/Rendering/Composition/Server/ServerCompositionTarget.cs

@ -39,13 +39,12 @@ namespace Avalonia.Rendering.Composition.Server
public int RenderedVisuals { get; set; } public int RenderedVisuals { get; set; }
public int VisitedVisuals { get; set; } public int VisitedVisuals { get; set; }
public ServerCompositionTarget(ServerCompositor compositor, Func<IEnumerable<object>> surfaces, public ServerCompositionTarget(ServerCompositor compositor, Func<IEnumerable<object>> surfaces)
DiagnosticTextRenderer? diagnosticTextRenderer)
: base(compositor) : base(compositor)
{ {
_compositor = compositor; _compositor = compositor;
_surfaces = surfaces; _surfaces = surfaces;
_overlays = new CompositionTargetOverlays(this, diagnosticTextRenderer); _overlays = new CompositionTargetOverlays(this);
var platformRender = AvaloniaLocator.Current.GetService<IPlatformRenderInterface>(); var platformRender = AvaloniaLocator.Current.GetService<IPlatformRenderInterface>();
if (platformRender?.SupportsRegions == true && compositor.Options.UseRegionDirtyRectClipping != false) if (platformRender?.SupportsRegions == true && compositor.Options.UseRegionDirtyRectClipping != false)

Loading…
Cancel
Save