using System;
using System.Diagnostics;
using System.Linq;
using System.Text;
using UnityEngine;
using Debug = UnityEngine.Debug;
namespace Unity.VisualScripting
{
public static class ConsoleProfiler
{
private static readonly Color[] levelColors =
{
new Color(.14f, .65f, 1.00f),
new Color(.89f, .12f, .12f),
new Color(.09f, .85f, .43f),
new Color(.80f, .24f, 1.00f),
new Color(1.00f, .79f, .0f),
new Color(.09f, .80f, .85f),
new Color(.66f, .85f, .09f),
};
[Conditional("ENABLE_PROFILER")]
public static void Dump(TimeSpan threshold)
{
if (ProfilingUtility.rootSegment.children.Count == 0)
{
return;
}
var sb = new StringBuilder();
Append(sb, 0, ProfilingUtility.rootSegment, threshold);
ProfilingUtility.Clear();
Debug.Log(sb);
}
[Conditional("ENABLE_PROFILER")]
public static void Dump()
{
Dump(TimeSpan.Zero);
}
private static void Append(StringBuilder sb, int indent, ProfiledSegment segmentParent, TimeSpan threshold)
{
var totalElapsed = TimeSpan.Zero;
foreach (var segment in segmentParent.children.OrderByDescending(s => s.stopwatch.Elapsed))
{
if (segment.stopwatch.Elapsed < threshold)
{
continue;
}
totalElapsed += segment.stopwatch.Elapsed;
var elapsedProportion = segmentParent.parent == null ? 1 : segment.stopwatch.Elapsed.TotalMilliseconds / segmentParent.stopwatch.Elapsed.TotalMilliseconds;
var color = levelColors[indent % levelColors.Length];
sb.AppendLineFormat
(
"{1}{2}: {3:0.0}ms ({4:0}%) ({5}x, ~{6:0.000}ms/x)",
color.ToHexString(),
new string(' ', indent * 4),
segment.name,
segment.stopwatch.Elapsed.TotalMilliseconds,
elapsedProportion * 100,
segment.calls,
segment.stopwatch.Elapsed.TotalMilliseconds / segment.calls
);
indent++;
Append(sb, indent, segment, threshold);
indent--;
}
if (segmentParent.children.Count > 0)
{
var remainingElapsed = (segmentParent.stopwatch.Elapsed - totalElapsed);
if (remainingElapsed > threshold)
{
var remainingElapsedProportion = remainingElapsed.TotalMilliseconds / segmentParent.stopwatch.Elapsed.TotalMilliseconds;
var color = levelColors[indent % levelColors.Length];
sb.AppendLineFormat
(
"{0}{1}: {2:0.0}ms ({3:0}%)",
new string(' ', indent * 4),
"Remaining",
remainingElapsed.TotalMilliseconds,
remainingElapsedProportion * 100,
color.ToHexString()
);
}
}
}
}
}