using System; namespace UnityEditor.Performance.ProfileAnalyzer { [Serializable] /// <summary> /// Metrics related to an individual frame /// </summary> internal struct FrameTime : IComparable<FrameTime> { /// <summary>Duration in the frame in milliseconds</summary> public float ms; /// <summary>Index of which frame this time duration occured on. A zero based frame index</summary> public int frameIndex; /// <summary>Number of occurrences</summary> public int count; /// <summary>Initialise FrameTime</summary> /// <param name="index"> The frame index</param> /// <param name="msTime"> The duration of the frame in milliseconds</param> /// <param name="_count"> The number of occurrences</param> public FrameTime(int index, float msTime, int _count) { frameIndex = index; ms = msTime; count = _count; } /// <summary>Initialise from another FrameTime</summary> /// <param name="t"> The FrameTime to assign</param> public FrameTime(FrameTime t) { frameIndex = t.frameIndex; ms = t.ms; count = t.count; } /// <summary>Compare the time duration between the frames. Used for sorting in ascending order</summary> /// <param name="other"> The other FrameTime to compare </param> /// <returns>-1 if this is smaller, 0 if the same, 1 if this is larger</returns> public int CompareTo(FrameTime other) { if (ms == other.ms) { // secondary sort by frame index order return frameIndex.CompareTo(other.frameIndex); } return ms.CompareTo(other.ms); } /// <summary>Compare the time duration between two FrameTimes. Used for sorting in ascending order</summary> /// <param name="a"> The first FrameTime to compare </param> /// <param name="b"> The second FrameTime to compare </param> /// <returns>-1 if a is smaller, 0 if the same, 1 if a is larger</returns> public static int CompareMs(FrameTime a, FrameTime b) { if (a.ms == b.ms) { // secondary sort by frame index order return a.frameIndex.CompareTo(b.frameIndex); } return a.ms.CompareTo(b.ms); } /// <summary>Compare the instance count between two FrameTimes. Used for sorting in ascending order</summary> /// <param name="a"> The first FrameTime to compare </param> /// <param name="b"> The second FrameTime to compare </param> /// <returns>-1 if a is smaller, 0 if the same, 1 if a is larger</returns> public static int CompareCount(FrameTime a, FrameTime b) { if (a.count == b.count) { // secondary sort by frame index order return a.frameIndex.CompareTo(b.frameIndex); } return a.count.CompareTo(b.count); } /// <summary>Compare the time duration between two FrameTimes. Used for sorting in descending order</summary> /// <param name="a"> The first FrameTime to compare </param> /// <param name="b"> The second FrameTime to compare </param> /// <returns>-1 if a is larger, 0 if the same, 1 if a is smaller</returns> public static int CompareMsDescending(FrameTime a, FrameTime b) { if (a.ms == b.ms) { // secondary sort by frame index order return a.frameIndex.CompareTo(b.frameIndex); } return -a.ms.CompareTo(b.ms); } /// <summary>Compare the instance count between two FrameTimes. Used for sorting in descending order</summary> /// <param name="a"> The first FrameTime to compare </param> /// <param name="b"> The second FrameTime to compare </param> /// <returns>-1 if a is larger, 0 if the same, 1 if a is smaller</returns> public static int CompareCountDescending(FrameTime a, FrameTime b) { if (a.count == b.count) { // secondary sort by frame index order return a.frameIndex.CompareTo(b.frameIndex); } return -a.count.CompareTo(b.count); } } }