// 这个函数一定要在 Step 之前调用(否则 mCurrentIndex 就变到下一帧去了) public static void RecordSnapshot(float snapshotTime) { GraphItData g = GraphIt.Instance.Graphs[GName_Creation]; if (g == null) { return; } mSnapshotTimestamps[g.mCurrentIndex] = snapshotTime; }
/// <summary> /// Allows you to switch between sharing the y-axis on a graph for all subgraphs, or for them to be independent. /// </summary> /// <param name="graph"></param> /// <param name="shared_y_axis"></param> public static void ShareYAxis(string graph, bool shared_y_axis) { #if UNITY_EDITOR if (!Instance.Graphs.ContainsKey(graph)) { Instance.Graphs[graph] = new GraphItData(graph); } GraphItData g = Instance.Graphs[graph]; g.mSharedYAxis = shared_y_axis; #endif }
/// <summary> /// Allows you to manually unpause a graph. Graphs are paused initially until you Log data to them. /// </summary> /// <param name="graph"></param> public static void UnpauseGraph(string graph) { #if UNITY_EDITOR if (!Instance.Graphs.ContainsKey(graph)) { Instance.Graphs[graph] = new GraphItData(graph); } GraphItData g = Instance.Graphs[graph]; g.mReadyForUpdate = true; #endif }
/// <summary> /// Optional setup function that allows you to specify if the graph is hidden or not by default /// </summary> /// <param name="graph"></param> /// <param name="subgraph"></param> /// <param name="include_0"></param> public static void GraphSetupHidden(string graph, bool hidden) { #if UNITY_EDITOR if (!Instance.Graphs.ContainsKey(graph)) { Instance.Graphs[graph] = new GraphItData(graph); } GraphItData g = Instance.Graphs[graph]; g.SetHidden(hidden); #endif }
/// <summary> /// Optional setup function that allows you to specify the initial height of a graph. /// </summary> /// <param name="graph"></param> /// <param name="subgraph"></param> /// <param name="height"></param> public static void GraphSetupHeight(string graph, float height) { #if UNITY_EDITOR if (!Instance.Graphs.ContainsKey(graph)) { Instance.Graphs[graph] = new GraphItData(graph); } GraphItData g = Instance.Graphs[graph]; g.SetHeight(height); #endif }
/// <summary> /// Optional setup function that allows you to specify both the inclusion of Y-axis 0. /// </summary> /// <param name="graph"></param> /// <param name="subgraph"></param> /// <param name="include_0"></param> public static void GraphSetupInclude0(string graph, bool include_0) { #if UNITY_EDITOR if (!Instance.Graphs.ContainsKey(graph)) { Instance.Graphs[graph] = new GraphItData(graph); } GraphItData g = Instance.Graphs[graph]; g.mInclude0 = include_0; #endif }
// Update is called once per fixed frame void FixedUpdate() { #if UNITY_EDITOR foreach (KeyValuePair <string, GraphItData> kv in Graphs) { GraphItData g = kv.Value; if (g.mReadyForUpdate && g.mFixedUpdate) { StepGraphInternal(g); } } #endif }
/// <summary> /// Optional setup function that allows you to specify the color of the subgraph. /// </summary> /// <param name="graph"></param> /// <param name="subgraph"></param> /// <param name="color"></param> public static void GraphSetupColour(string graph, string subgraph, Color color) { #if UNITY_EDITOR if (!Instance.Graphs.ContainsKey(graph)) { Instance.Graphs[graph] = new GraphItData(graph); } GraphItData g = Instance.Graphs[graph]; if (!g.mData.ContainsKey(subgraph)) { g.mData[subgraph] = new GraphItDataInternal(g.mData.Count); } g.mData[subgraph].mColor = color; #endif }
/// <summary> /// Log floating point data for this frame. Mutiple calls to this with the same graph will add logged values together. /// </summary> /// <param name="graph"></param> /// <param name="subgraph"></param> /// <param name="f"></param> public static void Log(string graph, string subgraph, float f) { #if UNITY_EDITOR if (!Instance.Graphs.ContainsKey(graph)) { Instance.Graphs[graph] = new GraphItData(graph); } GraphItData g = Instance.Graphs[graph]; if (!g.mData.ContainsKey(subgraph)) { g.mData[subgraph] = new GraphItDataInternal(g.mData.Count); } g.mData[subgraph].mCounter += f; g.mReadyForUpdate = true; #endif }
/// <summary> /// Optional setup function that allows you to specify how many samples to track. /// </summary> /// <param name="graph"></param> /// <param name="sample_window"></param> public static void GraphSetupSampleWindowSize(string graph, int sample_window) { #if UNITY_EDITOR if (!Instance.Graphs.ContainsKey(graph)) { Instance.Graphs[graph] = new GraphItData(graph); } GraphItData g = Instance.Graphs[graph]; int samples = Math.Max(sample_window, GraphItData.RECENT_WINDOW_SIZE + 1); g.mWindowSize = samples; foreach (KeyValuePair <string, GraphItDataInternal> entry in g.mData) { GraphItDataInternal _g = entry.Value; _g.mDataPoints = new float[samples]; } #endif }
void StepGraphInternal(GraphItData graph) { #if UNITY_EDITOR foreach (KeyValuePair <string, GraphItDataInternal> entry in graph.mData) { GraphItDataInternal g = entry.Value; g.mDataPoints[graph.mCurrentIndex] = g.mCounter; g.mCounter = 0.0f; } graph.mCurrentIndex = (graph.mCurrentIndex + 1) % graph.mWindowSize; if (graph.mCurrentIndex == 0) { graph.mFullArray = true; } foreach (KeyValuePair <string, GraphItDataInternal> entry in graph.mData) { GraphItDataInternal g = entry.Value; float sum = g.mDataPoints[0]; float min = g.mDataPoints[0]; float max = g.mDataPoints[0]; for (int i = 1; i < graph.GraphLength(); ++i) { sum += g.mDataPoints[i]; min = Mathf.Min(min, g.mDataPoints[i]); max = Mathf.Max(max, g.mDataPoints[i]); } if (graph.mInclude0) { min = Mathf.Min(min, 0.0f); max = Mathf.Max(max, 0.0f); } //Calculate the recent average int recent_start = graph.mCurrentIndex - GraphItData.RECENT_WINDOW_SIZE; int recent_count = GraphItData.RECENT_WINDOW_SIZE; if (recent_start < 0) { if (graph.mFullArray) { recent_start += g.mDataPoints.Length; } else { recent_count = graph.GraphLength(); recent_start = 0; } } float recent_sum = 0.0f; for (int i = 0; i < recent_count; ++i) { recent_sum += g.mDataPoints[recent_start]; recent_start = (recent_start + 1) % g.mDataPoints.Length; } g.mMin = min; g.mMax = max; g.mAvg = sum / graph.GraphLength(); g.mFastAvg = recent_sum / recent_count; } #endif }