#if ENABLE_PROFILER
using HarmonyLib;
using System.Collections.Generic;
using System.Reflection;
using UnityEngine;
using UnityEngine.Profiling;
namespace NewHorizons.Patches;
///
/// attach profiler markers to important methods
///
[HarmonyPatch]
public static class ProfilerPatch
{
private static string FriendlyName(this MethodBase @this) => $"{@this.DeclaringType.Name}.{@this.Name}";
[HarmonyTargetMethods]
public static IEnumerable TargetMethods()
{
foreach (var type in Assembly.GetExecutingAssembly().GetTypes())
{
// if (!type.Name.EndsWith("Builder")) continue;
// if (!(type.FullName.Contains("Builder") || type.FullName.Contains("Utility"))) continue;
foreach (var method in type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly))
{
if (!(
method.Name.StartsWith("Make") ||
method.Name.StartsWith("Init") ||
method.Name == "SetUpStreaming" ||
method.Name == "OnSceneLoaded" ||
method.DeclaringType.Name.EndsWith("Utilities")
)) continue;
if (method.ContainsGenericParameters) continue;
Main.Instance.ModHelper.Console.WriteLine($"[profiler] profiling {method.FriendlyName()}");
yield return method;
}
}
}
[HarmonyPrefix]
public static void Prefix(MethodBase __originalMethod /*, out Stopwatch __state*/)
{
Profiler.BeginSample(__originalMethod.FriendlyName());
// __state = new Stopwatch();
// __state.Start();
}
[HarmonyPostfix]
public static void Postfix( /*MethodBase __originalMethod, Stopwatch __state*/)
{
Profiler.EndSample();
// __state.Stop();
// Main.Instance.ModHelper.Console.WriteLine($"[profiler] {__originalMethod.MethodName()} took {__state.Elapsed.TotalMilliseconds:f1} ms");
}
}
[HarmonyPatch]
public static class EvilPatch
{
[HarmonyPrefix]
[HarmonyPatch(typeof(StackTraceUtility), "ExtractStackTrace")]
[HarmonyPatch(typeof(Application), "CallLogCallback")]
private static bool DisableShaderLogSpam() => false;
}
#endif