diff --git a/Dalamud/Interface/Internal/Windows/TitleScreenMenuWindow.cs b/Dalamud/Interface/Internal/Windows/TitleScreenMenuWindow.cs index faf99aa2a..88f291954 100644 --- a/Dalamud/Interface/Internal/Windows/TitleScreenMenuWindow.cs +++ b/Dalamud/Interface/Internal/Windows/TitleScreenMenuWindow.cs @@ -10,7 +10,6 @@ using Dalamud.Game.Addon.Lifecycle.AddonArgTypes; using Dalamud.Game.ClientState; using Dalamud.Game.Gui; using Dalamud.Game.Text; -using Dalamud.Game.Text.SeStringHandling; using Dalamud.Interface.Animation.EasingFunctions; using Dalamud.Interface.ManagedFontAtlas; using Dalamud.Interface.ManagedFontAtlas.Internals; @@ -19,16 +18,18 @@ using Dalamud.Interface.Utility; using Dalamud.Interface.Utility.Raii; using Dalamud.Interface.Windowing; using Dalamud.Plugin.Internal; -using Dalamud.Plugin.Internal.Types; using Dalamud.Plugin.Services; using Dalamud.Storage.Assets; -using Dalamud.Support; using Dalamud.Utility; using FFXIVClientStructs.FFXIV.Component.GUI; using ImGuiNET; +using Lumina.Text.ReadOnly; + +using LSeStringBuilder = Lumina.Text.SeStringBuilder; + namespace Dalamud.Interface.Internal.Windows; /// @@ -59,6 +60,8 @@ internal class TitleScreenMenuWindow : Window, IDisposable private InOutCubic? fadeOutEasing; private State state = State.Hide; + + private int lastLoadedPluginCount = -1; /// /// Initializes a new instance of the class. @@ -441,29 +444,37 @@ internal class TitleScreenMenuWindow : Window, IDisposable textNode->TextFlags |= (byte)TextFlags.MultiLine; textNode->AlignmentType = AlignmentType.TopLeft; + var containsDalamudVersionString = textNode->OriginalTextPointer == textNode->NodeText.StringPtr; if (!this.configuration.ShowTsm || !this.showTsm.Value) { - textNode->NodeText.SetString(addon->AtkValues[1].String); + if (containsDalamudVersionString) + textNode->SetText(addon->AtkValues[1].String); + this.lastLoadedPluginCount = -1; return; } var pm = Service.GetNullable(); + var count = pm?.LoadedPluginCount ?? 0; - var pluginCount = pm?.InstalledPlugins.Count(c => c.State == PluginState.Loaded) ?? 0; + // Avoid rebuilding the string every frame. + if (containsDalamudVersionString && count == this.lastLoadedPluginCount) + return; + this.lastLoadedPluginCount = count; - var titleVersionText = new SeStringBuilder() - .AddText(addon->AtkValues[1].GetValueAsString()) - .AddText("\n\n") - .AddUiGlow(701) - .AddUiForeground(SeIconChar.BoxedLetterD.ToIconString(), 539) - .AddUiGlowOff() - .AddText($" Dalamud: {Util.GetScmVersion()}") - .AddText($" - {pluginCount} {(pluginCount != 1 ? "plugins" : "plugin")} loaded"); + var lssb = LSeStringBuilder.SharedPool.Get(); + lssb.Append(new ReadOnlySeStringSpan(addon->AtkValues[1].String)).Append("\n\n"); + lssb.PushEdgeColorType(701).PushColorType(539) + .Append(SeIconChar.BoxedLetterD.ToIconChar()) + .PopColorType().PopEdgeColorType(); + lssb.Append($" Dalamud: {Util.GetScmVersion()}"); - if (pm?.SafeMode ?? false) - titleVersionText.AddUiForeground(" [SAFE MODE]", 17); + lssb.Append($" - {count} {(count != 1 ? "plugins" : "plugin")} loaded"); - textNode->NodeText.SetString(titleVersionText.Build().EncodeWithNullTerminator()); + if (pm?.SafeMode is true) + lssb.PushColorType(17).Append(" [SAFE MODE]").PopColorType(); + + textNode->SetText(lssb.GetViewAsSpan()); + LSeStringBuilder.SharedPool.Return(lssb); } private void TitleScreenMenuEntryListChange() => this.privateAtlas.BuildFontsAsync(); diff --git a/Dalamud/Plugin/Internal/PluginManager.cs b/Dalamud/Plugin/Internal/PluginManager.cs index ddb59c027..9d71c60df 100644 --- a/Dalamud/Plugin/Internal/PluginManager.cs +++ b/Dalamud/Plugin/Internal/PluginManager.cs @@ -162,6 +162,27 @@ internal class PluginManager : IInternalDisposableService /// public static int DalamudApiLevel { get; private set; } + /// + /// Gets the number of loaded plugins. + /// + public int LoadedPluginCount + { + get + { + var res = 0; + lock (this.pluginListLock) + { + foreach (var p in this.installedPluginsList) + { + if (p.State == PluginState.Loaded) + res++; + } + } + + return res; + } + } + /// /// Gets a copy of the list of all loaded plugins. ///