Browse Source

Added a performance debug window currently showing the startup performance

CPKreuz 1 year ago
parent
commit
e7956f5450

+ 21 - 9
src/PixiEditor/ViewModels/SubViewModels/DebugViewModel.cs

@@ -90,9 +90,9 @@ internal class DebugViewModel : SubViewModel<ViewModelMain>
     
 
     [Command.Debug("PixiEditor.Debug.IO.OpenLocalAppDataDirectory", @"PixiEditor", "OPEN_LOCAL_APPDATA_DIR", "OPEN_LOCAL_APPDATA_DIR",
-        MenuItemPath = "DEBUG/OPEN_LOCAL_APPDATA_DIR", MenuItemOrder = 3, Icon = PixiPerfectIcons.Folder, AnalyticsTrack = true)]
+        MenuItemPath = "DEBUG/OPEN_LOCAL_APPDATA_DIR", MenuItemOrder = 5, Icon = PixiPerfectIcons.Folder, AnalyticsTrack = true)]
     [Command.Debug("PixiEditor.Debug.IO.OpenCrashReportsDirectory", @"PixiEditor\crash_logs", "OPEN_CRASH_REPORTS_DIR", "OPEN_CRASH_REPORTS_DIR",
-        MenuItemPath = "DEBUG/OPEN_CRASH_REPORTS_DIR", MenuItemOrder = 4, Icon = PixiPerfectIcons.Folder, AnalyticsTrack = true)]
+        MenuItemPath = "DEBUG/OPEN_CRASH_REPORTS_DIR", MenuItemOrder = 6, Icon = PixiPerfectIcons.Folder, AnalyticsTrack = true)]
     public static void OpenLocalAppDataFolder(string subDirectory)
     {
         var path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), subDirectory);
@@ -100,7 +100,7 @@ internal class DebugViewModel : SubViewModel<ViewModelMain>
     }
 
     [Command.Debug("PixiEditor.Debug.IO.OpenRoamingAppDataDirectory", @"PixiEditor", "OPEN_ROAMING_APPDATA_DIR", "OPEN_ROAMING_APPDATA_DIR", Icon = PixiPerfectIcons.Folder,
-        MenuItemPath = "DEBUG/OPEN_ROAMING_APPDATA_DIR", MenuItemOrder = 5)]
+        MenuItemPath = "DEBUG/OPEN_ROAMING_APPDATA_DIR", MenuItemOrder = 7)]
     public static void OpenAppDataFolder(string subDirectory)
     {
         var path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), subDirectory);
@@ -108,7 +108,7 @@ internal class DebugViewModel : SubViewModel<ViewModelMain>
     }
 
     [Command.Debug("PixiEditor.Debug.IO.OpenTempDirectory", @"PixiEditor", "OPEN_TEMP_DIR", "OPEN_TEMP_DIR", Icon = PixiPerfectIcons.Folder,
-        MenuItemPath = "DEBUG/OPEN_TEMP_DIR", MenuItemOrder = 6, AnalyticsTrack = true)]
+        MenuItemPath = "DEBUG/OPEN_TEMP_DIR", MenuItemOrder = 8, AnalyticsTrack = true)]
     public static void OpenTempFolder(string subDirectory)
     {
         var path = Path.Combine(Path.GetTempPath(), subDirectory);
@@ -250,6 +250,18 @@ internal class DebugViewModel : SubViewModel<ViewModelMain>
 
     }
 
+    [Command.Debug("PixiEditor.Debug.OpenPerformanceDebugWindow", "Open Performance Debug Window", "Open Performance Debug Window",
+        MenuItemPath = "DEBUG/Open Performance Debug Window", MenuItemOrder = 4, AnalyticsTrack = true)]
+    public void OpenPerformanceDebugWindow()
+    {
+        if (Application.Current.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
+        {
+            var window = desktop.Windows.OfType<PerformanceDebugWindow>().FirstOrDefault(new PerformanceDebugWindow());
+            window.Show();
+            window.Activate();
+        }
+    }
+
     [Command.Internal("PixiEditor.Debug.SetLanguageFromFilePicker", AnalyticsTrack = true)]
     public async Task SetLanguageFromFilePicker()
     {
@@ -276,22 +288,22 @@ internal class DebugViewModel : SubViewModel<ViewModelMain>
     }
 
     [Command.Debug("PixiEditor.Debug.IO.OpenInstallDirectory", "OPEN_INSTALLATION_DIR", "OPEN_INSTALLATION_DIR", Icon = PixiPerfectIcons.Folder,
-        MenuItemPath = "DEBUG/OPEN_INSTALLATION_DIR", MenuItemOrder = 8, AnalyticsTrack = true)]
+        MenuItemPath = "DEBUG/OPEN_INSTALLATION_DIR", MenuItemOrder = 9, AnalyticsTrack = true)]
     public static void OpenInstallLocation()
     {
         IOperatingSystem.Current.OpenFolder(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));
     }
 
     [Command.Debug("PixiEditor.Debug.Crash", "CRASH", "CRASH_APP",
-        MenuItemPath = "DEBUG/CRASH", MenuItemOrder = 9, AnalyticsTrack = true)]
+        MenuItemPath = "DEBUG/CRASH", MenuItemOrder = 10, AnalyticsTrack = true)]
     public static void Crash() => throw new InvalidOperationException("User requested to crash :c");
 
     [Command.Debug("PixiEditor.Debug.DeleteUserPreferences", @"%appdata%\PixiEditor\user_preferences.json", "DELETE_USR_PREFS", "DELETE_USR_PREFS",
-        MenuItemPath = "DEBUG/DELETE/USER_PREFS", MenuItemOrder = 10, AnalyticsTrack = true)]
+        MenuItemPath = "DEBUG/DELETE/USER_PREFS", MenuItemOrder = 11, AnalyticsTrack = true)]
     [Command.Debug("PixiEditor.Debug.DeleteShortcutFile", @"%appdata%\PixiEditor\shortcuts.json", "DELETE_SHORTCUT_FILE", "DELETE_SHORTCUT_FILE",
-        MenuItemPath = "DEBUG/DELETE/SHORTCUT_FILE", MenuItemOrder = 11, AnalyticsTrack = true)]
+        MenuItemPath = "DEBUG/DELETE/SHORTCUT_FILE", MenuItemOrder = 12, AnalyticsTrack = true)]
     [Command.Debug("PixiEditor.Debug.DeleteEditorData", @"%localappdata%\PixiEditor\editor_data.json", "DELETE_EDITOR_DATA", "DELETE_EDITOR_DATA",
-        MenuItemPath = "DEBUG/DELETE/EDITOR_DATA", MenuItemOrder = 12, AnalyticsTrack = true)]
+        MenuItemPath = "DEBUG/DELETE/EDITOR_DATA", MenuItemOrder = 13, AnalyticsTrack = true)]
     public static async Task DeleteFile(string path)
     {
         if (MainWindow.Current is null)

+ 30 - 0
src/PixiEditor/Views/Dialogs/Debugging/PerformanceDebugWindow.axaml

@@ -0,0 +1,30 @@
+<dialogs:PixiEditorPopup xmlns="https://github.com/avaloniaui"
+                         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+                         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+                         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+                         xmlns:dialogs="clr-namespace:PixiEditor.Views.Dialogs"
+                         mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
+                         x:Class="PixiEditor.Views.Dialogs.Debugging.PerformanceDebugWindow"
+                         Title="Performance"
+                         Name="performanceDebug"
+                         MinWidth="450" MinHeight="200"
+                         Width="450" Height="200">
+    <StackPanel Orientation="Vertical" Margin="5">
+        <TextBlock VerticalAlignment="Center">
+            <Run Text="Start Time: "/>
+            <Run Text="{Binding StartupPerformance.ProcessStart, ElementName=performanceDebug}" />
+        </TextBlock>
+        <TextBlock VerticalAlignment="Center">
+            <Run Text="Time to Main Window: "/>
+            <Run Text="{Binding StartupPerformance.TimeToMainWindow, ElementName=performanceDebug}" />
+        </TextBlock>
+        <TextBlock VerticalAlignment="Center">
+            <Run Text="Time to Main View Model: "/>
+            <Run Text="{Binding StartupPerformance.TimeToMainViewModel, ElementName=performanceDebug}" />
+        </TextBlock>
+        <TextBlock VerticalAlignment="Center">
+            <Run Text="Time to Interactivity: "/>
+            <Run Text="{Binding StartupPerformance.TimeToInteractivity, ElementName=performanceDebug}" />
+        </TextBlock>
+    </StackPanel>
+</dialogs:PixiEditorPopup>

+ 17 - 0
src/PixiEditor/Views/Dialogs/Debugging/PerformanceDebugWindow.axaml.cs

@@ -0,0 +1,17 @@
+using PixiEditor.Models.AnalyticsAPI;
+
+namespace PixiEditor.Views.Dialogs.Debugging;
+
+public partial class PerformanceDebugWindow : PixiEditorPopup
+{
+    public StartupPerformance StartupPerformance
+    {
+        get => MainWindow.Current.StartupPerformance;
+    }
+    
+    public PerformanceDebugWindow()
+    {
+        InitializeComponent();
+    }
+}
+

+ 5 - 5
src/PixiEditor/Views/MainWindow.axaml.cs

@@ -34,7 +34,7 @@ internal partial class MainWindow : Window
     private readonly IServiceProvider services;
     private static ExtensionLoader extLoader;
 
-    private StartupPerformance _startupPerformance = new();
+    public StartupPerformance StartupPerformance { get; } = new();
     
     public new ViewModels_ViewModelMain DataContext
     {
@@ -56,7 +56,7 @@ internal partial class MainWindow : Window
 
     public MainWindow(ExtensionLoader extensionLoader)
     {
-        _startupPerformance.ReportToMainWindow();
+        StartupPerformance.ReportToMainWindow();
         
         (Application.Current.ApplicationLifetime as IClassicDesktopStyleApplicationLifetime).MainWindow = this;
         extLoader = extensionLoader;
@@ -77,7 +77,7 @@ internal partial class MainWindow : Window
         platform = services.GetRequiredService<IPlatform>();
         DataContext = services.GetRequiredService<ViewModels_ViewModelMain>();
         DataContext.Setup(services);
-        _startupPerformance.ReportToMainViewModel();
+        StartupPerformance.ReportToMainViewModel();
 
         var analytics = services.GetService<AnalyticsPeriodicReporter>();
         analytics?.Start();
@@ -161,8 +161,8 @@ internal partial class MainWindow : Window
         base.OnLoaded(e);
         LoadingWindow.Instance?.SafeClose();
         Activate();
-        _startupPerformance.ReportToInteractivity();
-        Analytics.SendStartup(_startupPerformance);
+        StartupPerformance.ReportToInteractivity();
+        Analytics.SendStartup(StartupPerformance);
     }
 
     protected override void OnClosing(WindowClosingEventArgs e)