Exemple #1
0
    // 这个函数一定要在 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
    }