From 029daf79c97e7fed493e00b4f562ac0f43bfe916 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Mon, 25 Mar 2024 19:32:38 +0500 Subject: [PATCH] Added a separate diagnostics graph to track Update method timing (#15109) --- .../Server/CompositionTargetOverlays.cs | 21 ++++++++++++++++++- .../Server/ServerCompositionTarget.cs | 2 ++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/Avalonia.Base/Rendering/Composition/Server/CompositionTargetOverlays.cs b/src/Avalonia.Base/Rendering/Composition/Server/CompositionTargetOverlays.cs index ac21f0393b..7038e9cd46 100644 --- a/src/Avalonia.Base/Rendering/Composition/Server/CompositionTargetOverlays.cs +++ b/src/Avalonia.Base/Rendering/Composition/Server/CompositionTargetOverlays.cs @@ -11,6 +11,7 @@ internal class CompositionTargetOverlays { private FpsCounter? _fpsCounter; private FrameTimeGraph? _renderTimeGraph; + private FrameTimeGraph? _updateTimeGraph; private FrameTimeGraph? _layoutTimeGraph; private Rect? _oldFpsCounterRect; private long _updateStarted; @@ -35,6 +36,11 @@ internal class CompositionTargetOverlays private FrameTimeGraph? RenderTimeGraph => _renderTimeGraph ??= CreateTimeGraph("Render"); + + private FrameTimeGraph? UpdateTimeGraph + => _updateTimeGraph ??= CreateTimeGraph("RUpdate"); + + public bool RequireLayer => DebugOverlays.HasAnyFlag(RendererDebugOverlays.DirtyRects); @@ -91,7 +97,17 @@ internal class CompositionTargetOverlays } } - public void MarkUpdateCallStart() => _updateStarted = CaptureTiming ? Stopwatch.GetTimestamp() : 0L; + public void MarkUpdateCallStart() + { + if (CaptureTiming) + _updateStarted = CaptureTiming ? Stopwatch.GetTimestamp() : 0L; + } + + public void MarkUpdateCallEnd() + { + if (CaptureTiming) + UpdateTimeGraph?.AddFrameValue(StopwatchHelper.GetElapsedTime(_updateStarted).TotalMilliseconds); + } private void DrawOverlays(ImmediateDrawingContext targetContext, bool hasLayer, Size logicalSize) { @@ -129,7 +145,10 @@ internal class CompositionTargetOverlays DrawTimeGraph(LayoutTimeGraph); if (DebugOverlays.HasFlag(RendererDebugOverlays.RenderTimeGraph)) + { DrawTimeGraph(RenderTimeGraph); + DrawTimeGraph(UpdateTimeGraph); + } } diff --git a/src/Avalonia.Base/Rendering/Composition/Server/ServerCompositionTarget.cs b/src/Avalonia.Base/Rendering/Composition/Server/ServerCompositionTarget.cs index 5e55de8903..b94829312d 100644 --- a/src/Avalonia.Base/Rendering/Composition/Server/ServerCompositionTarget.cs +++ b/src/Avalonia.Base/Rendering/Composition/Server/ServerCompositionTarget.cs @@ -136,6 +136,8 @@ namespace Avalonia.Rendering.Composition.Server _updateRequested = false; Readback.CompleteWrite(Revision); + _overlays.MarkUpdateCallEnd(); + if (!_redrawRequested) return; _redrawRequested = false;