| using UnityEngine; |
|
|
| namespace UnityEditor.Performance.ProfileAnalyzer |
| { |
| internal class Histogram |
| { |
| Draw2D m_2D; |
| Color m_ColorBarBackground; |
| DisplayUnits m_Units; |
|
|
| public void SetUnits(Units units) |
| { |
| m_Units = new DisplayUnits(units); |
| } |
|
|
| public Histogram(Draw2D draw2D, Units units) |
| { |
| m_2D = draw2D; |
| SetUnits(units); |
| m_ColorBarBackground = new Color(0.5f, 0.5f, 0.5f); |
| } |
|
|
| public Histogram(Draw2D draw2D, Units units, Color barBackground) |
| { |
| m_2D = draw2D; |
| SetUnits(units); |
| m_ColorBarBackground = barBackground; |
| } |
|
|
| public void DrawStart(float width) |
| { |
| EditorGUILayout.BeginHorizontal(GUILayout.Width(width + 10)); |
|
|
| EditorGUILayout.BeginVertical(); |
| } |
|
|
| public void DrawEnd(float width, float min, float max, float spacing) |
| { |
| EditorGUILayout.BeginHorizontal(); |
| float halfWidth = width / 2; |
| GUIStyle leftAlignStyle = new GUIStyle(GUI.skin.label); |
| leftAlignStyle.contentOffset = new Vector2(-5, 0); |
| leftAlignStyle.alignment = TextAnchor.MiddleLeft; |
| GUIStyle rightAlignStyle = new GUIStyle(GUI.skin.label); |
| rightAlignStyle.contentOffset = new Vector2(-5, 0); |
| rightAlignStyle.alignment = TextAnchor.MiddleRight; |
| EditorGUILayout.LabelField(m_Units.ToString(min, false, 5, true), leftAlignStyle, GUILayout.Width(halfWidth)); |
| EditorGUILayout.LabelField(m_Units.ToString(max, false, 5, true), rightAlignStyle, GUILayout.Width(halfWidth)); |
| EditorGUILayout.EndHorizontal(); |
|
|
| EditorGUILayout.EndVertical(); |
|
|
| EditorGUILayout.EndHorizontal(); |
| } |
|
|
| public void DrawBackground(float width, float height, int bucketCount, float min, float max, float spacing) |
| { |
| |
|
|
| float x = (spacing / 2); |
| float y = 0; |
| float w = ((width + spacing) / bucketCount) - spacing; |
| float h = height; |
|
|
| for (int i = 0; i < bucketCount; i++) |
| { |
| m_2D.DrawFilledBox(x, y, w, h, m_ColorBarBackground); |
| x += w; |
| x += spacing; |
| } |
| } |
|
|
| public void DrawData(float width, float height, int[] buckets, int totalFrameCount, float min, float max, Color barColor, float spacing) |
| { |
| float range = max - min; |
|
|
| |
| int bucketCount = buckets.Length; |
|
|
| float x = (spacing / 2); |
| float y = 0; |
| float w = ((width + spacing) / bucketCount) - spacing; |
| float h = height; |
|
|
| float bucketWidth = (range / bucketCount); |
| Rect rect = GUILayoutUtility.GetLastRect(); |
| for (int bucketAt = 0; bucketAt < bucketCount; bucketAt++) |
| { |
| var count = buckets[bucketAt]; |
|
|
| float barHeight = (h * count) / totalFrameCount; |
| if (count > 0) |
| barHeight = Mathf.Max(1.0f, barHeight); |
| m_2D.DrawFilledBox(x, y, w, barHeight, barColor); |
|
|
| float bucketStart = min + (bucketAt * bucketWidth); |
| float bucketEnd = bucketStart + bucketWidth; |
|
|
| var tooltip = string.Format("{0}-{1}\n{2} {3}\n\nBar width: {4}", |
| m_Units.ToTooltipString(bucketStart, false), |
| m_Units.ToTooltipString(bucketEnd, true), |
| count, |
| count == 1 ? "frame" : "frames", |
| m_Units.ToTooltipString(bucketWidth, true) |
| ); |
|
|
| var content = new GUIContent("", tooltip); |
| GUI.Label(new Rect(rect.x + x, rect.y + y, w, h), content); |
|
|
| x += w; |
| x += spacing; |
| } |
| } |
|
|
| public void Draw(float width, float height, int[] buckets, int totalFrameCount, float min, float max, Color barColor) |
| { |
| DrawStart(width); |
|
|
| float spacing = 2; |
|
|
| if (m_2D.DrawStart(width, height, Draw2D.Origin.BottomLeft)) |
| { |
| DrawBackground(width, height, buckets.Length, min, max, spacing); |
| DrawData(width, height, buckets, totalFrameCount, min, max, barColor, spacing); |
| m_2D.DrawEnd(); |
| } |
|
|
| DrawEnd(width, min, max, spacing); |
| } |
| } |
| } |
|
|