| 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; |
| } |
| } |
| } |
|
|