This commit is contained in:
2021-06-13 10:28:03 +02:00
parent eb70603c85
commit df2d24cbd3
7487 changed files with 943244 additions and 0 deletions

View File

@@ -0,0 +1,21 @@
using System.Diagnostics;
namespace Unity.VisualScripting
{
public class ProfiledSegment
{
public ProfiledSegment(ProfiledSegment parent, string name)
{
this.parent = parent;
this.name = name;
stopwatch = new Stopwatch();
children = new ProfiledSegmentCollection();
}
public string name { get; private set; }
public Stopwatch stopwatch { get; private set; }
public long calls { get; set; }
public ProfiledSegment parent { get; private set; }
public ProfiledSegmentCollection children { get; private set; }
}
}

View File

@@ -0,0 +1,12 @@
using System.Collections.ObjectModel;
namespace Unity.VisualScripting
{
public class ProfiledSegmentCollection : KeyedCollection<string, ProfiledSegment>
{
protected override string GetKeyForItem(ProfiledSegment item)
{
return item.name;
}
}
}

View File

@@ -0,0 +1,17 @@
using System;
namespace Unity.VisualScripting
{
public struct ProfilingScope : IDisposable
{
public ProfilingScope(string name)
{
ProfilingUtility.BeginSample(name);
}
public void Dispose()
{
ProfilingUtility.EndSample();
}
}
}

View File

@@ -0,0 +1,68 @@
using System.Diagnostics;
using System.Threading;
using UnityEngine.Profiling;
namespace Unity.VisualScripting
{
public static class ProfilingUtility
{
static ProfilingUtility()
{
currentSegment = rootSegment = new ProfiledSegment(null, "Root");
}
private static readonly object @lock = new object();
public static ProfiledSegment rootSegment { get; private set; }
public static ProfiledSegment currentSegment { get; set; }
[Conditional("ENABLE_PROFILER")]
public static void Clear()
{
currentSegment = rootSegment = new ProfiledSegment(null, "Root");
}
public static ProfilingScope SampleBlock(string name)
{
return new ProfilingScope(name);
}
[Conditional("ENABLE_PROFILER")]
public static void BeginSample(string name)
{
Monitor.Enter(@lock);
if (!currentSegment.children.Contains(name))
{
currentSegment.children.Add(new ProfiledSegment(currentSegment, name));
}
currentSegment = currentSegment.children[name];
currentSegment.calls++;
currentSegment.stopwatch.Start();
if (UnityThread.allowsAPI)
{
Profiler.BeginSample(name);
}
}
[Conditional("ENABLE_PROFILER")]
public static void EndSample()
{
currentSegment.stopwatch.Stop();
if (currentSegment.parent != null)
{
currentSegment = currentSegment.parent;
}
if (UnityThread.allowsAPI)
{
Profiler.EndSample();
}
Monitor.Exit(@lock);
}
}
}