private void DrawInstanceProfiler(Listing_Extended lister, Settings settings) { lister.LabelColored("Profile Harmony Instances", TitleLabelColor); Rect buttonRect1 = lister.GetRect(Text.LineHeight), buttonRect2 = buttonRect1, buttonRect3 = buttonRect1; buttonRect2.width = buttonRect3.width = buttonRect1.width = buttonRect1.width / 3; buttonRect2.x = buttonRect1.xMax; buttonRect3.x = buttonRect2.xMax; if (Widgets.ButtonText(buttonRect1, "Get instances")) { settings.profileInstances = String.Join("\n", HarmonyMain.GetAllHarmonyInstances().ToArray()); } if (!settings.profileInstances.IsNullOrEmpty()) { lister.CheckboxLabeled("Allow transpiled methods(slow patching)", ref settings.allowTranspiledMethods); if (Widgets.ButtonText(buttonRect2, $"Profile instances")) { PatchHandler.Initialize(); var instances = settings.profileInstances.Split(new[] { "\r\n", "\n" }, StringSplitOptions.RemoveEmptyEntries); Profiler.Logger.LogOperation("PatchesProfiling", () => Patcher.ProfileHarmonyPatches(instances, true, !settings.allowTranspiledMethods)); } if (Widgets.ButtonText(buttonRect3, "Unpatch instances")) { var instances = settings.profileInstances.Split(new[] { "\r\n", "\n" }, StringSplitOptions.RemoveEmptyEntries); Profiler.Logger.LogOperation("UnpatchInstances", () => Patcher.UnpatchInstances(instances)); } } settings.profileInstances = lister.TextAreaFocusControl("InstancesProfilerField", settings.profileInstances, 5, ref instancesScrollPos); lister.Gap(20f); }
private void DrawModsProfiler(Listing_Extended lister, Settings settings) { lister.LabelColored("Profile Mods", TitleLabelColor); Rect buttonRect1 = lister.GetRect(Text.LineHeight), buttonRect2 = buttonRect1; buttonRect2.width = buttonRect1.width /= 2; buttonRect2.x = buttonRect1.xMax; if (Widgets.ButtonText(buttonRect1, "Get mods")) { settings.profileMods = String.Join("\n", LoadedModManager.RunningModsListForReading.Select(x => Path.GetFileName(x.RootDir)).ToArray()); } if (!settings.profileMods.IsNullOrEmpty()) { lister.CheckboxLabeled("Allow Core assembly", ref settings.allowCoreAsm); if (Widgets.ButtonText(buttonRect2, $"Profile mods")) { PatchHandler.Initialize(); var mods = settings.profileMods.Split(new[] { "\r\n", "\n" }, StringSplitOptions.RemoveEmptyEntries); Profiler.Logger.LogOperation("ModsProfiling", () => Patcher.ProfileMods(mods.ToList())); } } settings.profileMods = lister.TextAreaFocusControl("ModsProfilerField", settings.profileMods, 5, ref modsScrollPos); lister.Gap(20f); }
private void DrawCustomProfiler(Listing_Extended lister, Settings settings) { lister.LabelColored("Profile Custom(Methods,Classes,Namespaces)", TitleLabelColor); Rect buttonRect1 = lister.GetRect(Text.LineHeight), buttonRect2 = buttonRect1; buttonRect2.width = buttonRect1.width /= 2; buttonRect2.x = buttonRect1.xMax; if (Widgets.ButtonText(buttonRect1, "Profile all dlls")) { PatchHandler.Initialize(); var methods = new HashSet <string>(); var modDllNames = Utils.GetAllModsDll(); //File.WriteAllLines("dsdsd", modDllNames.ToArray()); foreach (var modDllName in modDllNames) { //Log.Warning($"[dll] {modDllName}"); foreach (var @class in Utils.GetClassesFromDll(modDllName)) { methods.AddDefMethodsAdvanced(@class, settings.allowCoreAsm, !settings.allowInheritedMethods); } } Profiler.Logger.LogOperation("DllProfiling", () => Patcher.ProfileMethods(methods.ToArray())); } //if (!settings.profileCustom.IsNullOrEmptyOrEqual(Settings.CustomExampleStr)) { lister.CheckboxLabeled("Allow Core assembly", ref settings.allowCoreAsm); lister.CheckboxLabeled("Allow class inherited methods", ref settings.allowInheritedMethods); if (Widgets.ButtonText(buttonRect2, $"Profile custom methods")) { PatchHandler.Initialize(); var methods = new HashSet <string>(); var list = settings.profileCustom.Split(new[] { "\r\n", "\n" }, StringSplitOptions.RemoveEmptyEntries); foreach (var s in list) { // it's method if (s.Contains(":")) { methods.Add(s); } else if (s.EndsWith(".dll")) { string dllName = s.Replace(".dll", ""); foreach (var @class in Utils.GetClassesFromDll(dllName)) { methods.AddDefMethodsAdvanced(@class, settings.allowCoreAsm, !settings.allowInheritedMethods); } } else { Type type = AccessTools.TypeByName(s); // it's class if (type?.IsClass ?? false) { methods.AddDefMethodsAdvanced(type, settings.allowCoreAsm, !settings.allowInheritedMethods); } else // parse namespace { var classes = Utils.GetClassesFromNamespace(s); if (!classes.Any()) { Log.Error($"[HarmonyProfiler] Found 0 results for namespace:'{s}'"); } foreach (var @class in classes) { methods.AddDefMethodsAdvanced(@class, settings.allowCoreAsm, !settings.allowInheritedMethods); } } } } Profiler.Logger.LogOperation("CustomProfiling", () => Patcher.ProfileMethods(methods.ToArray())); } } settings.profileCustom = lister.TextAreaFocusControl("CustomProfilerField", settings.profileCustom, 5, ref customScrollPos); lister.Gap(20f); }