From 5b9d3e783aa34b3ca4f2086b339c0cc5da026063 Mon Sep 17 00:00:00 2001 From: Robert Date: Sat, 5 Feb 2022 12:11:14 +0100 Subject: [PATCH] Debugger - Add FPS and other metrics to performance tab as well Debugger - Add RGB.NET delta to rendering tab --- src/Artemis.Core/Services/CoreService.cs | 1 + .../Performance/PerformanceDebugView.xaml | 14 ++- .../Performance/PerformanceDebugViewModel.cs | 91 ++++++++++++++++++- .../Settings/Debug/Tabs/RenderDebugView.xaml | 2 + .../Debug/Tabs/RenderDebugViewModel.cs | 18 +++- 5 files changed, 120 insertions(+), 6 deletions(-) diff --git a/src/Artemis.Core/Services/CoreService.cs b/src/Artemis.Core/Services/CoreService.cs index 8f9bfdbd5..0b3ca3fe8 100644 --- a/src/Artemis.Core/Services/CoreService.cs +++ b/src/Artemis.Core/Services/CoreService.cs @@ -208,6 +208,7 @@ namespace Artemis.Core.Services ); _logger.Information("Startup arguments: {args}", StartupArguments); _logger.Information("Elevated permissions: {perms}", IsElevated); + _logger.Information("Stopwatch high resolution: {perms}", Stopwatch.IsHighResolution); ApplyLoggingLevel(); diff --git a/src/Artemis.UI/Screens/Settings/Debug/Tabs/Performance/PerformanceDebugView.xaml b/src/Artemis.UI/Screens/Settings/Debug/Tabs/Performance/PerformanceDebugView.xaml index a63321f76..2d677e599 100644 --- a/src/Artemis.UI/Screens/Settings/Debug/Tabs/Performance/PerformanceDebugView.xaml +++ b/src/Artemis.UI/Screens/Settings/Debug/Tabs/Performance/PerformanceDebugView.xaml @@ -11,6 +11,7 @@ d:DataContext="{d:DesignInstance local:PerformanceDebugViewModel}"> + @@ -19,7 +20,18 @@ If you are having performance issues, below you can find out which plugin might be the culprit. - + + + + + + + + + + + + diff --git a/src/Artemis.UI/Screens/Settings/Debug/Tabs/Performance/PerformanceDebugViewModel.cs b/src/Artemis.UI/Screens/Settings/Debug/Tabs/Performance/PerformanceDebugViewModel.cs index 8b439619e..376d1edc7 100644 --- a/src/Artemis.UI/Screens/Settings/Debug/Tabs/Performance/PerformanceDebugViewModel.cs +++ b/src/Artemis.UI/Screens/Settings/Debug/Tabs/Performance/PerformanceDebugViewModel.cs @@ -1,7 +1,13 @@ -using System.Linq; +using System.Diagnostics; +using System.IO; +using System.Linq; using System.Timers; +using System.Windows; +using System.Windows.Media.Imaging; using Artemis.Core; using Artemis.Core.Services; +using SkiaSharp; +using SkiaSharp.Views.WPF; using Stylet; namespace Artemis.UI.Screens.Settings.Debug.Tabs.Performance @@ -10,14 +16,56 @@ namespace Artemis.UI.Screens.Settings.Debug.Tabs.Performance { private readonly IPluginManagementService _pluginManagementService; private readonly Timer _updateTimer; + private readonly ICoreService _coreService; + private readonly Timer _fpsTimer; + private double _currentFps; + private int _renderWidth; + private int _renderHeight; + private string _renderer; + private int _frames; + private double _delta; + private double _lastDelta; - public PerformanceDebugViewModel(IPluginManagementService pluginManagementService) + public PerformanceDebugViewModel(ICoreService coreService, IPluginManagementService pluginManagementService) { + _coreService = coreService; _pluginManagementService = pluginManagementService; _updateTimer = new Timer(500); - + _fpsTimer = new Timer(1000); + DisplayName = "PERFORMANCE"; _updateTimer.Elapsed += UpdateTimerOnElapsed; + _fpsTimer.Start(); + } + + public double CurrentFps + { + get => _currentFps; + set => SetAndNotify(ref _currentFps, value); + } + + public int RenderWidth + { + get => _renderWidth; + set => SetAndNotify(ref _renderWidth, value); + } + + public int RenderHeight + { + get => _renderHeight; + set => SetAndNotify(ref _renderHeight, value); + } + + public string Renderer + { + get => _renderer; + set => SetAndNotify(ref _renderer, value); + } + + public double Delta + { + get => _delta; + set => SetAndNotify(ref _delta, value); } private void UpdateTimerOnElapsed(object sender, ElapsedEventArgs e) @@ -57,6 +105,10 @@ namespace Artemis.UI.Screens.Settings.Debug.Tabs.Performance _pluginManagementService.PluginDisabled += PluginToggled; _pluginManagementService.PluginFeatureEnabled += FeatureToggled; _pluginManagementService.PluginFeatureDisabled += FeatureToggled; + _coreService.FrameRendering += CoreServiceOnFrameRendering; + _coreService.FrameRendered += CoreServiceOnFrameRendered; + _fpsTimer.Elapsed += FpsTimerOnElapsed; + base.OnActivate(); } @@ -68,10 +120,43 @@ namespace Artemis.UI.Screens.Settings.Debug.Tabs.Performance _pluginManagementService.PluginDisabled -= PluginToggled; _pluginManagementService.PluginFeatureEnabled -= FeatureToggled; _pluginManagementService.PluginFeatureDisabled -= FeatureToggled; + _coreService.FrameRendering -= CoreServiceOnFrameRendering; + _coreService.FrameRendered -= CoreServiceOnFrameRendered; + _fpsTimer.Elapsed -= FpsTimerOnElapsed; + Items.Clear(); base.OnDeactivate(); } + /// + protected override void OnClose() + { + _fpsTimer.Dispose(); + base.OnClose(); + } + #endregion + + private void FpsTimerOnElapsed(object sender, ElapsedEventArgs e) + { + Delta = _lastDelta; + CurrentFps = _frames; + Renderer = Constants.ManagedGraphicsContext != null ? Constants.ManagedGraphicsContext.GetType().Name : "Software"; + _frames = 0; + } + + private void CoreServiceOnFrameRendering(object? sender, FrameRenderingEventArgs e) + { + _lastDelta = e.DeltaTime; + } + + private void CoreServiceOnFrameRendered(object sender, FrameRenderedEventArgs e) + { + _frames++; + + SKImageInfo bitmapInfo = e.Texture.ImageInfo; + RenderHeight = bitmapInfo.Height; + RenderWidth = bitmapInfo.Width; + } } } \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Settings/Debug/Tabs/RenderDebugView.xaml b/src/Artemis.UI/Screens/Settings/Debug/Tabs/RenderDebugView.xaml index 4a5c4205d..36aa6340a 100644 --- a/src/Artemis.UI/Screens/Settings/Debug/Tabs/RenderDebugView.xaml +++ b/src/Artemis.UI/Screens/Settings/Debug/Tabs/RenderDebugView.xaml @@ -36,6 +36,8 @@ + + diff --git a/src/Artemis.UI/Screens/Settings/Debug/Tabs/RenderDebugViewModel.cs b/src/Artemis.UI/Screens/Settings/Debug/Tabs/RenderDebugViewModel.cs index c1de5b041..72dab52c0 100644 --- a/src/Artemis.UI/Screens/Settings/Debug/Tabs/RenderDebugViewModel.cs +++ b/src/Artemis.UI/Screens/Settings/Debug/Tabs/RenderDebugViewModel.cs @@ -25,6 +25,8 @@ namespace Artemis.UI.Screens.Settings.Debug.Tabs private string _frameTargetPath; private string _renderer; private int _frames; + private double _delta; + private double _lastDelta; public RenderDebugViewModel(ICoreService coreService) { @@ -64,6 +66,12 @@ namespace Artemis.UI.Screens.Settings.Debug.Tabs set => SetAndNotify(ref _renderer, value); } + public double Delta + { + get => _delta; + set => SetAndNotify(ref _delta, value); + } + public void SaveFrame() { VistaSaveFileDialog dialog = new VistaSaveFileDialog {Filter = "Portable network graphic (*.png)|*.png", Title = "Save render frame"}; @@ -80,6 +88,7 @@ namespace Artemis.UI.Screens.Settings.Debug.Tabs protected override void OnActivate() { + _coreService.FrameRendering += CoreServiceOnFrameRendering; _coreService.FrameRendered += CoreServiceOnFrameRendered; _fpsTimer.Elapsed += FpsTimerOnElapsed; base.OnActivate(); @@ -87,6 +96,7 @@ namespace Artemis.UI.Screens.Settings.Debug.Tabs protected override void OnDeactivate() { + _coreService.FrameRendering -= CoreServiceOnFrameRendering; _coreService.FrameRendered -= CoreServiceOnFrameRendered; _fpsTimer.Elapsed -= FpsTimerOnElapsed; base.OnDeactivate(); @@ -98,6 +108,10 @@ namespace Artemis.UI.Screens.Settings.Debug.Tabs base.OnClose(); } + private void CoreServiceOnFrameRendering(object? sender, FrameRenderingEventArgs e) + { + _lastDelta = e.DeltaTime; + } private void CoreServiceOnFrameRendered(object sender, FrameRenderedEventArgs e) { @@ -145,9 +159,9 @@ namespace Artemis.UI.Screens.Settings.Debug.Tabs private void FpsTimerOnElapsed(object sender, ElapsedEventArgs e) { + Delta = _lastDelta; CurrentFps = _frames; - // Renderer = Constants.ManagedGraphicsContext != null ? Constants.ManagedGraphicsContext.GetType().Name : "Software"; - Renderer = $"HighAccuracyTimers: {Stopwatch.IsHighResolution}"; + Renderer = Constants.ManagedGraphicsContext != null ? Constants.ManagedGraphicsContext.GetType().Name : "Software"; _frames = 0; } }