|
using System; |
|
using System.Collections.Generic; |
|
|
|
namespace UnityEditor.Performance.ProfileAnalyzer |
|
{ |
|
[Serializable] |
|
internal class MarkerData : IComparable<MarkerData> |
|
{ |
|
public string name; |
|
public int nameLowerCaseHash; |
|
|
|
public double msTotal; |
|
public int count; |
|
public int countMin; |
|
public int countMax; |
|
public float countMean; |
|
public int countMedian; |
|
public int countLowerQuartile; |
|
public int countUpperQuartile; |
|
public float countStandardDeviation; |
|
public int lastFrame; |
|
public int presentOnFrameCount; |
|
public int firstFrameIndex; |
|
public float msMean; |
|
public float msMedian; |
|
public float msLowerQuartile; |
|
public float msUpperQuartile; |
|
public float msMin; |
|
public float msMax; |
|
public float msStandardDeviation; |
|
public int minIndividualFrameIndex; |
|
public int maxIndividualFrameIndex; |
|
public float msMinIndividual; |
|
public float msMaxIndividual; |
|
public float msAtMedian; |
|
public int medianFrameIndex; |
|
public int minFrameIndex; |
|
public int maxFrameIndex; |
|
public int minDepth; |
|
public int maxDepth; |
|
public List<string> threads; |
|
|
|
const int bucketCount = 20; |
|
public int[] buckets; |
|
public int[] countBuckets; |
|
public List<FrameTime> frames; |
|
|
|
public double timeRemoved; |
|
public double timeIgnored; |
|
|
|
public MarkerData(string markerName) |
|
{ |
|
buckets = new int[bucketCount]; |
|
countBuckets = new int[bucketCount]; |
|
frames = new List<FrameTime>(); |
|
threads = new List<string>(); |
|
|
|
name = markerName; |
|
nameLowerCaseHash = markerName.ToLower().GetHashCode(); |
|
msTotal = 0.0; |
|
count = 0; |
|
countMin = 0; |
|
countMax = 0; |
|
countMean = 0f; |
|
countMedian = 0; |
|
countLowerQuartile = 0; |
|
countUpperQuartile = 0; |
|
countStandardDeviation = 0f; |
|
lastFrame = -1; |
|
presentOnFrameCount = 0; |
|
firstFrameIndex = -1; |
|
msMean = 0f; |
|
msMedian = 0f; |
|
msLowerQuartile = 0f; |
|
msUpperQuartile = 0f; |
|
msMin = float.MaxValue; |
|
msMax = float.MinValue; |
|
msStandardDeviation = 0f; |
|
minIndividualFrameIndex = 0; |
|
maxIndividualFrameIndex = 0; |
|
msMinIndividual = float.MaxValue; |
|
msMaxIndividual = float.MinValue; |
|
msAtMedian = 0f; |
|
medianFrameIndex = 0; |
|
minFrameIndex = 0; |
|
maxFrameIndex = 0; |
|
minDepth = 0; |
|
maxDepth = 0; |
|
|
|
for (int b = 0; b < buckets.Length; b++) |
|
{ |
|
buckets[b] = 0; |
|
countBuckets[b] = 0; |
|
} |
|
|
|
timeRemoved = 0.0; |
|
timeIgnored = 0.0; |
|
} |
|
|
|
|
|
|
|
|
|
public int CompareTo(MarkerData other) |
|
{ |
|
if (msMedian == other.msMedian) |
|
{ |
|
if (medianFrameIndex == other.medianFrameIndex) |
|
{ |
|
|
|
return name.CompareTo(other.name); |
|
} |
|
|
|
|
|
return medianFrameIndex.CompareTo(other.medianFrameIndex); |
|
} |
|
|
|
return -msMedian.CompareTo(other.msMedian); |
|
} |
|
|
|
public float GetFrameMs(int frameIndex) |
|
{ |
|
foreach (var frameData in frames) |
|
{ |
|
if (frameData.frameIndex == frameIndex) |
|
return frameData.ms; |
|
} |
|
|
|
return 0f; |
|
} |
|
|
|
public void ComputeBuckets(float min, float max) |
|
{ |
|
float first = min; |
|
float last = max; |
|
float range = last - first; |
|
|
|
int maxBucketIndex = (buckets.Length - 1); |
|
|
|
for (int bucketIndex = 0; bucketIndex < buckets.Length; bucketIndex++) |
|
{ |
|
buckets[bucketIndex] = 0; |
|
} |
|
|
|
float scale = range > 0 ? buckets.Length / range : 0; |
|
|
|
for (int i = 0, n = frames.Count; i < n; i++) |
|
{ |
|
var frameTime = frames[i]; |
|
var ms = frameTime.ms; |
|
|
|
|
|
int bucketIndex = (int)((ms - first) * scale); |
|
if (bucketIndex < 0 || bucketIndex > maxBucketIndex) |
|
{ |
|
|
|
|
|
|
|
|
|
|
|
if (bucketIndex > maxBucketIndex) |
|
bucketIndex = maxBucketIndex; |
|
else |
|
bucketIndex = 0; |
|
} |
|
buckets[bucketIndex] += 1; |
|
} |
|
|
|
if (range == 0) |
|
{ |
|
|
|
for (int bucketIndex = 1; bucketIndex < buckets.Length; bucketIndex++) |
|
{ |
|
buckets[bucketIndex] = buckets[0]; |
|
} |
|
} |
|
} |
|
|
|
public void ComputeCountBuckets(int min, int max) |
|
{ |
|
float first = min; |
|
float last = max; |
|
float range = last - first; |
|
|
|
int maxBucketIndex = (countBuckets.Length - 1); |
|
|
|
for (int bucketIndex = 0; bucketIndex < countBuckets.Length; bucketIndex++) |
|
{ |
|
countBuckets[bucketIndex] = 0; |
|
} |
|
|
|
float scale = range > 0 ? countBuckets.Length / range : 0; |
|
|
|
for (int i = 0, n = frames.Count; i < n; i++) |
|
{ |
|
var frameTime = frames[i]; |
|
var count = frameTime.count; |
|
|
|
int bucketIndex = (int)((count - first) * scale); |
|
if (bucketIndex < 0 || bucketIndex > maxBucketIndex) |
|
{ |
|
if (bucketIndex > maxBucketIndex) |
|
bucketIndex = maxBucketIndex; |
|
else |
|
bucketIndex = 0; |
|
} |
|
countBuckets[bucketIndex] += 1; |
|
} |
|
|
|
if (range == 0) |
|
{ |
|
|
|
for (int bucketIndex = 1; bucketIndex < countBuckets.Length; bucketIndex++) |
|
{ |
|
countBuckets[bucketIndex] = countBuckets[0]; |
|
} |
|
} |
|
} |
|
|
|
public static string GetFirstThread(MarkerData marker) |
|
{ |
|
return marker != null ? marker.threads[0] : ""; |
|
} |
|
|
|
public static float GetMsMax(MarkerData marker) |
|
{ |
|
return marker != null ? marker.msMax : 0.0f; |
|
} |
|
|
|
public static int GetMaxFrameIndex(MarkerData marker) |
|
{ |
|
return marker != null ? marker.maxFrameIndex : 0; |
|
} |
|
|
|
public static float GetMsMin(MarkerData marker) |
|
{ |
|
return marker != null ? marker.msMin : 0.0f; |
|
} |
|
|
|
public static int GetMinFrameIndex(MarkerData marker) |
|
{ |
|
return marker != null ? marker.minFrameIndex : 0; |
|
} |
|
|
|
public static float GetMsMedian(MarkerData marker) |
|
{ |
|
return marker != null ? marker.msMedian : 0.0f; |
|
} |
|
|
|
public static int GetMedianFrameIndex(MarkerData marker) |
|
{ |
|
return marker != null ? marker.medianFrameIndex : 0; |
|
} |
|
|
|
public static float GetMsUpperQuartile(MarkerData marker) |
|
{ |
|
return marker != null ? marker.msUpperQuartile : 0.0f; |
|
} |
|
|
|
public static float GetMsLowerQuartile(MarkerData marker) |
|
{ |
|
return marker != null ? marker.msLowerQuartile : 0.0f; |
|
} |
|
|
|
public static float GetMsMean(MarkerData marker) |
|
{ |
|
return marker != null ? marker.msMean : 0.0f; |
|
} |
|
|
|
public static float GetMsMinIndividual(MarkerData marker) |
|
{ |
|
return marker != null ? marker.msMinIndividual : 0.0f; |
|
} |
|
|
|
public static float GetMsMaxIndividual(MarkerData marker) |
|
{ |
|
return marker != null ? marker.msMaxIndividual : 0.0f; |
|
} |
|
|
|
public static int GetPresentOnFrameCount(MarkerData marker) |
|
{ |
|
return marker != null ? marker.presentOnFrameCount : 0; |
|
} |
|
|
|
public static float GetMsAtMedian(MarkerData marker) |
|
{ |
|
return marker != null ? marker.msAtMedian : 0.0f; |
|
} |
|
|
|
public static int GetCountMin(MarkerData marker) |
|
{ |
|
return marker != null ? marker.countMin : 0; |
|
} |
|
|
|
public static int GetCountMax(MarkerData marker) |
|
{ |
|
return marker != null ? marker.countMax : 0; |
|
} |
|
|
|
public static int GetCount(MarkerData marker) |
|
{ |
|
return marker != null ? marker.count : 0; |
|
} |
|
|
|
public static float GetCountMean(MarkerData marker) |
|
{ |
|
return marker != null ? marker.countMean : 0.0f; |
|
} |
|
|
|
public static double GetMsTotal(MarkerData marker) |
|
{ |
|
return marker != null ? marker.msTotal : 0.0; |
|
} |
|
|
|
public static int GetMinDepth(MarkerData marker) |
|
{ |
|
return marker != null ? marker.minDepth : 0; |
|
} |
|
|
|
public static int GetMaxDepth(MarkerData marker) |
|
{ |
|
return marker != null ? marker.maxDepth : 0; |
|
} |
|
public static double GetTimeRemoved(MarkerData marker) |
|
{ |
|
return marker != null ? marker.timeRemoved : 0.0; |
|
} |
|
public static double GetTimeIgnored(MarkerData marker) |
|
{ |
|
return marker != null ? marker.timeIgnored : 0.0; |
|
} |
|
|
|
public bool IsFullyIgnored() |
|
{ |
|
if (timeIgnored > 0.0) |
|
{ |
|
if (msTotal == 0.0) |
|
return true; |
|
} |
|
|
|
return false; |
|
} |
|
} |
|
} |
|
|