Primary APIs:
TopLevel.RendererDiagnosticsRendererDiagnosticsRendererDebugOverlaysTopLevel.RequestAnimationFrame(...)Layoutable.LayoutUpdatedLayoutable.EffectiveViewportChangedLoggingExtensionsLoggerImportant members:
RendererDiagnostics.DebugOverlaysRendererDebugOverlays.FpsRendererDebugOverlays.DirtyRectsRendererDebugOverlays.LayoutTimeGraphRendererDebugOverlays.RenderTimeGraphTopLevel.RequestAnimationFrame(Action<TimeSpan>)Layoutable.UpdateLayout()AppBuilder.LogToTrace(...), LogToTextWriter(...), LogToDelegate(...)Logger.IsEnabled(...), Logger.TryGet(...)Reference source files:
src/Avalonia.Controls/TopLevel.cssrc/Avalonia.Base/Rendering/RendererDiagnostics.cssrc/Avalonia.Base/Rendering/RendererDebugOverlays.cssrc/Avalonia.Base/Layout/Layoutable.cssrc/Avalonia.Controls/LoggingExtensions.cssrc/Avalonia.Base/Logging/Logger.cssrc/tools/Avalonia.Generators/NameGenerator/InitializeComponentCodeGenerator.cssrc/tools/Avalonia.Generators/README.mdCore app-level diagnostics in this codebase:
AppBuilder.RequestAnimationFrame.LayoutUpdated and viewport events.Note on DevTools:
AttachDevTools() implementation is provided by Avalonia.Diagnostics package (outside this repository tree).attachDevTools wiring when that package is referenced.using Avalonia.Controls;
using Avalonia.Rendering;
var top = TopLevel.GetTopLevel(control);
if (top is not null)
{
top.RendererDiagnostics.DebugOverlays =
RendererDebugOverlays.Fps |
RendererDebugOverlays.LayoutTimeGraph |
RendererDebugOverlays.RenderTimeGraph;
}
top.RequestAnimationFrame(ts =>
{
// Record frame timestamp or simulation budget here.
UpdateFrame(ts);
});
AppBuilder.Configure<App>()
.LogToDelegate(
line => MyLog.Write(line),
Avalonia.Logging.LogEventLevel.Information,
Avalonia.Logging.LogArea.Layout,
Avalonia.Logging.LogArea.Visual)
.UsePlatformDetect();
myControl.LayoutUpdated += (_, _) =>
{
// Count or sample layout frequency for hotspot analysis.
};
Fps, DirtyRects, timing graphs).TopLevel instance targeted.MeasureOverride/ArrangeOverride logic.Avalonia.Diagnostics package not referenced.Default mode:
XAML-first references:
XAML-first usage example:
<StackPanel xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:MyApp.ViewModels"
x:DataType="vm:DiagnosticsViewModel"
Spacing="8">
<ToggleSwitch Content="Show FPS" IsChecked="{CompiledBinding ShowFps}" />
<Button Content="Enable Overlays" Command="{CompiledBinding EnableOverlaysCommand}" />
</StackPanel>
Code-only alternative (on request):
var top = TopLevel.GetTopLevel(this);
if (top is not null)
{
top.RendererDiagnostics.DebugOverlays =
RendererDebugOverlays.Fps | RendererDebugOverlays.RenderTimeGraph;
}