feat: add TimingEvent, time IM scene init

This commit is contained in:
goaaats 2022-05-28 17:31:52 +02:00
parent 3ff67c709d
commit 6c877723ce
No known key found for this signature in database
GPG key ID: 49E2AA8C6A76498B
5 changed files with 169 additions and 134 deletions

View file

@ -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)
{ {

View file

@ -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)

View 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; }
}

View file

@ -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()
{ {

View file

@ -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,
});
}
}
} }