mirror of
https://github.com/goatcorp/Dalamud.git
synced 2025-12-12 18:27:23 +01:00
feat: add TimingEvent, time IM scene init
This commit is contained in:
parent
3ff67c709d
commit
6c877723ce
5 changed files with 169 additions and 134 deletions
|
|
@ -120,7 +120,7 @@ namespace Dalamud
|
||||||
Log.Information("[T1] Game thread continued!");
|
Log.Information("[T1] Game thread continued!");
|
||||||
|
|
||||||
// Initialize FFXIVClientStructs function resolver
|
// Initialize FFXIVClientStructs function resolver
|
||||||
using (Timings.Start("FFXIVClientStructs Resolver Init"))
|
using (Timings.Start("CS Resolver Init"))
|
||||||
{
|
{
|
||||||
FFXIVClientStructs.Resolver.Initialize();
|
FFXIVClientStructs.Resolver.Initialize();
|
||||||
Log.Information("[T1] FFXIVClientStructs initialized!");
|
Log.Information("[T1] FFXIVClientStructs initialized!");
|
||||||
|
|
@ -311,6 +311,7 @@ namespace Dalamud
|
||||||
Troubleshooting.LogTroubleshooting();
|
Troubleshooting.LogTroubleshooting();
|
||||||
|
|
||||||
Log.Information("Dalamud is ready.");
|
Log.Information("Dalamud is ready.");
|
||||||
|
Timings.Event("Dalamud ready");
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -475,118 +475,121 @@ namespace Dalamud.Interface.Internal
|
||||||
|
|
||||||
if (this.scene == null)
|
if (this.scene == null)
|
||||||
{
|
{
|
||||||
try
|
using (Timings.Start("IM Scene Init"))
|
||||||
{
|
{
|
||||||
this.scene = new RawDX11Scene(swapChain);
|
try
|
||||||
}
|
|
||||||
catch (DllNotFoundException ex)
|
|
||||||
{
|
|
||||||
Log.Error(ex, "Could not load ImGui dependencies.");
|
|
||||||
|
|
||||||
var res = PInvoke.User32.MessageBox(
|
|
||||||
IntPtr.Zero,
|
|
||||||
"Dalamud plugins require the Microsoft Visual C++ Redistributable to be installed.\nPlease install the runtime from the official Microsoft website or disable Dalamud.\n\nDo you want to download the redistributable now?",
|
|
||||||
"Dalamud Error",
|
|
||||||
User32.MessageBoxOptions.MB_YESNO | User32.MessageBoxOptions.MB_TOPMOST | User32.MessageBoxOptions.MB_ICONERROR);
|
|
||||||
|
|
||||||
if (res == User32.MessageBoxResult.IDYES)
|
|
||||||
{
|
{
|
||||||
var psi = new ProcessStartInfo
|
this.scene = new RawDX11Scene(swapChain);
|
||||||
|
}
|
||||||
|
catch (DllNotFoundException ex)
|
||||||
|
{
|
||||||
|
Log.Error(ex, "Could not load ImGui dependencies.");
|
||||||
|
|
||||||
|
var res = PInvoke.User32.MessageBox(
|
||||||
|
IntPtr.Zero,
|
||||||
|
"Dalamud plugins require the Microsoft Visual C++ Redistributable to be installed.\nPlease install the runtime from the official Microsoft website or disable Dalamud.\n\nDo you want to download the redistributable now?",
|
||||||
|
"Dalamud Error",
|
||||||
|
User32.MessageBoxOptions.MB_YESNO | User32.MessageBoxOptions.MB_TOPMOST | User32.MessageBoxOptions.MB_ICONERROR);
|
||||||
|
|
||||||
|
if (res == User32.MessageBoxResult.IDYES)
|
||||||
{
|
{
|
||||||
FileName = "https://aka.ms/vs/16/release/vc_redist.x64.exe",
|
var psi = new ProcessStartInfo
|
||||||
UseShellExecute = true,
|
{
|
||||||
};
|
FileName = "https://aka.ms/vs/16/release/vc_redist.x64.exe",
|
||||||
Process.Start(psi);
|
UseShellExecute = true,
|
||||||
|
};
|
||||||
|
Process.Start(psi);
|
||||||
|
}
|
||||||
|
|
||||||
|
Environment.Exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
Environment.Exit(-1);
|
var startInfo = Service<DalamudStartInfo>.Get();
|
||||||
}
|
var configuration = Service<DalamudConfiguration>.Get();
|
||||||
|
|
||||||
var startInfo = Service<DalamudStartInfo>.Get();
|
var iniFileInfo = new FileInfo(Path.Combine(Path.GetDirectoryName(startInfo.ConfigurationPath), "dalamudUI.ini"));
|
||||||
var configuration = Service<DalamudConfiguration>.Get();
|
|
||||||
|
|
||||||
var iniFileInfo = new FileInfo(Path.Combine(Path.GetDirectoryName(startInfo.ConfigurationPath), "dalamudUI.ini"));
|
try
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (iniFileInfo.Length > 1200000)
|
|
||||||
{
|
{
|
||||||
Log.Warning("dalamudUI.ini was over 1mb, deleting");
|
if (iniFileInfo.Length > 1200000)
|
||||||
iniFileInfo.CopyTo(Path.Combine(iniFileInfo.DirectoryName, $"dalamudUI-{DateTimeOffset.Now.ToUnixTimeSeconds()}.ini"));
|
{
|
||||||
iniFileInfo.Delete();
|
Log.Warning("dalamudUI.ini was over 1mb, deleting");
|
||||||
|
iniFileInfo.CopyTo(Path.Combine(iniFileInfo.DirectoryName, $"dalamudUI-{DateTimeOffset.Now.ToUnixTimeSeconds()}.ini"));
|
||||||
|
iniFileInfo.Delete();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Log.Error(ex, "Could not delete dalamudUI.ini");
|
||||||
|
}
|
||||||
|
|
||||||
|
this.scene.ImGuiIniPath = iniFileInfo.FullName;
|
||||||
|
this.scene.OnBuildUI += this.Display;
|
||||||
|
this.scene.OnNewInputFrame += this.OnNewInputFrame;
|
||||||
|
|
||||||
|
StyleModel.TransferOldModels();
|
||||||
|
|
||||||
|
if (configuration.SavedStyles == null || configuration.SavedStyles.All(x => x.Name != StyleModelV1.DalamudStandard.Name))
|
||||||
|
{
|
||||||
|
configuration.SavedStyles = new List<StyleModel> { StyleModelV1.DalamudStandard, StyleModelV1.DalamudClassic };
|
||||||
|
configuration.ChosenStyle = StyleModelV1.DalamudStandard.Name;
|
||||||
|
}
|
||||||
|
else if (configuration.SavedStyles.Count == 1)
|
||||||
|
{
|
||||||
|
configuration.SavedStyles.Add(StyleModelV1.DalamudClassic);
|
||||||
|
}
|
||||||
|
else if (configuration.SavedStyles[1].Name != StyleModelV1.DalamudClassic.Name)
|
||||||
|
{
|
||||||
|
configuration.SavedStyles.Insert(1, StyleModelV1.DalamudClassic);
|
||||||
|
}
|
||||||
|
|
||||||
|
configuration.SavedStyles[0] = StyleModelV1.DalamudStandard;
|
||||||
|
configuration.SavedStyles[1] = StyleModelV1.DalamudClassic;
|
||||||
|
|
||||||
|
var style = configuration.SavedStyles.FirstOrDefault(x => x.Name == configuration.ChosenStyle);
|
||||||
|
if (style == null)
|
||||||
|
{
|
||||||
|
style = StyleModelV1.DalamudStandard;
|
||||||
|
configuration.ChosenStyle = style.Name;
|
||||||
|
configuration.Save();
|
||||||
|
}
|
||||||
|
|
||||||
|
style.Apply();
|
||||||
|
|
||||||
|
ImGui.GetIO().FontGlobalScale = configuration.GlobalUiScale;
|
||||||
|
|
||||||
|
this.SetupFonts();
|
||||||
|
|
||||||
|
if (!configuration.IsDocking)
|
||||||
|
{
|
||||||
|
ImGui.GetIO().ConfigFlags &= ~ImGuiConfigFlags.DockingEnable;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ImGui.GetIO().ConfigFlags |= ImGuiConfigFlags.DockingEnable;
|
||||||
|
}
|
||||||
|
|
||||||
|
// NOTE (Chiv) Toggle gamepad navigation via setting
|
||||||
|
if (!configuration.IsGamepadNavigationEnabled)
|
||||||
|
{
|
||||||
|
ImGui.GetIO().BackendFlags &= ~ImGuiBackendFlags.HasGamepad;
|
||||||
|
ImGui.GetIO().ConfigFlags &= ~ImGuiConfigFlags.NavEnableSetMousePos;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ImGui.GetIO().BackendFlags |= ImGuiBackendFlags.HasGamepad;
|
||||||
|
ImGui.GetIO().ConfigFlags |= ImGuiConfigFlags.NavEnableSetMousePos;
|
||||||
|
}
|
||||||
|
|
||||||
|
// NOTE (Chiv) Explicitly deactivate on dalamud boot
|
||||||
|
ImGui.GetIO().ConfigFlags &= ~ImGuiConfigFlags.NavEnableGamepad;
|
||||||
|
|
||||||
|
ImGuiHelpers.MainViewport = ImGui.GetMainViewport();
|
||||||
|
|
||||||
|
Log.Information("[IM] Scene & ImGui setup OK!");
|
||||||
|
|
||||||
|
Service<DalamudIME>.Get().Enable();
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Log.Error(ex, "Could not delete dalamudUI.ini");
|
|
||||||
}
|
|
||||||
|
|
||||||
this.scene.ImGuiIniPath = iniFileInfo.FullName;
|
|
||||||
this.scene.OnBuildUI += this.Display;
|
|
||||||
this.scene.OnNewInputFrame += this.OnNewInputFrame;
|
|
||||||
|
|
||||||
StyleModel.TransferOldModels();
|
|
||||||
|
|
||||||
if (configuration.SavedStyles == null || configuration.SavedStyles.All(x => x.Name != StyleModelV1.DalamudStandard.Name))
|
|
||||||
{
|
|
||||||
configuration.SavedStyles = new List<StyleModel> { StyleModelV1.DalamudStandard, StyleModelV1.DalamudClassic };
|
|
||||||
configuration.ChosenStyle = StyleModelV1.DalamudStandard.Name;
|
|
||||||
}
|
|
||||||
else if (configuration.SavedStyles.Count == 1)
|
|
||||||
{
|
|
||||||
configuration.SavedStyles.Add(StyleModelV1.DalamudClassic);
|
|
||||||
}
|
|
||||||
else if (configuration.SavedStyles[1].Name != StyleModelV1.DalamudClassic.Name)
|
|
||||||
{
|
|
||||||
configuration.SavedStyles.Insert(1, StyleModelV1.DalamudClassic);
|
|
||||||
}
|
|
||||||
|
|
||||||
configuration.SavedStyles[0] = StyleModelV1.DalamudStandard;
|
|
||||||
configuration.SavedStyles[1] = StyleModelV1.DalamudClassic;
|
|
||||||
|
|
||||||
var style = configuration.SavedStyles.FirstOrDefault(x => x.Name == configuration.ChosenStyle);
|
|
||||||
if (style == null)
|
|
||||||
{
|
|
||||||
style = StyleModelV1.DalamudStandard;
|
|
||||||
configuration.ChosenStyle = style.Name;
|
|
||||||
configuration.Save();
|
|
||||||
}
|
|
||||||
|
|
||||||
style.Apply();
|
|
||||||
|
|
||||||
ImGui.GetIO().FontGlobalScale = configuration.GlobalUiScale;
|
|
||||||
|
|
||||||
this.SetupFonts();
|
|
||||||
|
|
||||||
if (!configuration.IsDocking)
|
|
||||||
{
|
|
||||||
ImGui.GetIO().ConfigFlags &= ~ImGuiConfigFlags.DockingEnable;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ImGui.GetIO().ConfigFlags |= ImGuiConfigFlags.DockingEnable;
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE (Chiv) Toggle gamepad navigation via setting
|
|
||||||
if (!configuration.IsGamepadNavigationEnabled)
|
|
||||||
{
|
|
||||||
ImGui.GetIO().BackendFlags &= ~ImGuiBackendFlags.HasGamepad;
|
|
||||||
ImGui.GetIO().ConfigFlags &= ~ImGuiConfigFlags.NavEnableSetMousePos;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ImGui.GetIO().BackendFlags |= ImGuiBackendFlags.HasGamepad;
|
|
||||||
ImGui.GetIO().ConfigFlags |= ImGuiConfigFlags.NavEnableSetMousePos;
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE (Chiv) Explicitly deactivate on dalamud boot
|
|
||||||
ImGui.GetIO().ConfigFlags &= ~ImGuiConfigFlags.NavEnableGamepad;
|
|
||||||
|
|
||||||
ImGuiHelpers.MainViewport = ImGui.GetMainViewport();
|
|
||||||
|
|
||||||
Log.Information("[IM] Scene & ImGui setup OK!");
|
|
||||||
|
|
||||||
Service<DalamudIME>.Get().Enable();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.address.IsReshade)
|
if (this.address.IsReshade)
|
||||||
|
|
|
||||||
35
Dalamud/Utility/Timing/TimingEvent.cs
Normal file
35
Dalamud/Utility/Timing/TimingEvent.cs
Normal file
|
|
@ -0,0 +1,35 @@
|
||||||
|
namespace Dalamud.Utility.Timing;
|
||||||
|
|
||||||
|
public class TimingEvent
|
||||||
|
{
|
||||||
|
internal TimingEvent(string name)
|
||||||
|
{
|
||||||
|
this.Name = name;
|
||||||
|
this.StartTime = Timings.Stopwatch.Elapsed.TotalMilliseconds;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the time this timing started.
|
||||||
|
/// </summary>
|
||||||
|
public double StartTime { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the name of the timing.
|
||||||
|
/// </summary>
|
||||||
|
public string Name { get; init; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the member that created this timing.
|
||||||
|
/// </summary>
|
||||||
|
public string? MemberName { get; init; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the file name that created this timing.
|
||||||
|
/// </summary>
|
||||||
|
public string? FileName { get; init; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the line number that created this timing.
|
||||||
|
/// </summary>
|
||||||
|
public int LineNumber { get; init; }
|
||||||
|
}
|
||||||
|
|
@ -8,16 +8,14 @@ namespace Dalamud.Utility.Timing;
|
||||||
/// Class used for tracking a time interval taken.
|
/// Class used for tracking a time interval taken.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[DebuggerDisplay("{Name} - {Duration}")]
|
[DebuggerDisplay("{Name} - {Duration}")]
|
||||||
public sealed class TimingHandle : IDisposable
|
public sealed class TimingHandle : TimingEvent, IDisposable
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Initializes a new instance of the <see cref="TimingHandle"/> class.
|
/// Initializes a new instance of the <see cref="TimingHandle"/> class.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="name">The name of this timing.</param>
|
/// <param name="name">The name of this timing.</param>
|
||||||
internal TimingHandle(string name)
|
internal TimingHandle(string name) : base(name)
|
||||||
{
|
{
|
||||||
this.Name = name;
|
|
||||||
|
|
||||||
this.Parent = Timings.Current.Value;
|
this.Parent = Timings.Current.Value;
|
||||||
Timings.Current.Value = this;
|
Timings.Current.Value = this;
|
||||||
|
|
||||||
|
|
@ -27,8 +25,7 @@ public sealed class TimingHandle : IDisposable
|
||||||
{
|
{
|
||||||
this.ChildCount++;
|
this.ChildCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.StartTime = Timings.Stopwatch.Elapsed.TotalMilliseconds;
|
|
||||||
this.EndTime = this.StartTime;
|
this.EndTime = this.StartTime;
|
||||||
this.IsMainThread = ThreadSafety.IsMainThread;
|
this.IsMainThread = ThreadSafety.IsMainThread;
|
||||||
|
|
||||||
|
|
@ -41,11 +38,6 @@ public sealed class TimingHandle : IDisposable
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the time this timing started.
|
|
||||||
/// </summary>
|
|
||||||
public double StartTime { get; private set; }
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the time this timing ended.
|
/// Gets the time this timing ended.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
@ -81,26 +73,6 @@ public sealed class TimingHandle : IDisposable
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public uint Depth { get; private set; }
|
public uint Depth { get; private set; }
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the name of the timing.
|
|
||||||
/// </summary>
|
|
||||||
public string Name { get; init; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the member that created this timing.
|
|
||||||
/// </summary>
|
|
||||||
public string? MemberName { get; init; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the file name that created this timing.
|
|
||||||
/// </summary>
|
|
||||||
public string? FileName { get; init; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the line number that created this timing.
|
|
||||||
/// </summary>
|
|
||||||
public int LineNumber { get; init; }
|
|
||||||
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,8 @@ public static class Timings
|
||||||
/// All active timings.
|
/// All active timings.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal static readonly List<TimingHandle> ActiveTimings = new();
|
internal static readonly List<TimingHandle> ActiveTimings = new();
|
||||||
|
|
||||||
|
internal static readonly List<TimingEvent> Events = new();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Current active timing entry.
|
/// Current active timing entry.
|
||||||
|
|
@ -48,4 +50,26 @@ public static class Timings
|
||||||
LineNumber = sourceLineNumber,
|
LineNumber = sourceLineNumber,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Record a one-time event.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="name">The name of the timing.</param>
|
||||||
|
/// <param name="memberName">Name of the calling member.</param>
|
||||||
|
/// <param name="sourceFilePath">Name of the calling file.</param>
|
||||||
|
/// <param name="sourceLineNumber">Name of the calling line number.</param>
|
||||||
|
/// <returns>Disposable that stops the timing once disposed.</returns>
|
||||||
|
public static void Event(string name, [CallerMemberName] string memberName = "", [CallerFilePath] string sourceFilePath = "",
|
||||||
|
[CallerLineNumber] int sourceLineNumber = 0)
|
||||||
|
{
|
||||||
|
lock (Events)
|
||||||
|
{
|
||||||
|
Events.Add(new TimingEvent(name)
|
||||||
|
{
|
||||||
|
MemberName = memberName,
|
||||||
|
FileName = sourceFilePath,
|
||||||
|
LineNumber = sourceLineNumber,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue