Unity官方使用的FPS 的 计数方法,以及得出用于统计对比的中位数,平均数,方差

来源:互联网 发布:淘宝免费装修模板 编辑:程序博客网 时间:2024/05/29 11:26

Unity官方使用的FPS 的 计数方法,以及得出用于统计对比的中位数平均数,方差


还是直接代码吧。很简单的。

using UnityEngine;using System.Collections;using System.Collections.Generic;using UnityEditor;public class HUDFPS : MonoBehaviour { public float updateInterval = 0.1f; public float outputInterval = 10f; private float outputTime = 0; private float accum   = 0; // FPS accumulated over the interval private int   frames  = 0; // Frames drawn over the interval private float timeleft; // Left time for current interval List<float> fpsList = new List<float>(); float fps ; float AverageNumber; float MedianNumber; float varianceNumber; void Start()  {  timeleft = updateInterval;        QualitySettings.vSyncCount = 0;  } void Update()  {  }  void FixedUpdate()    {        outputTime += Time.deltaTime;        timeleft -= Time.deltaTime;        // Debug.Log(UnityStats.renderTime);        if (timeleft <= 0.0)        {            fps = (0.1f / UnityStats.renderTime) * 10;         //   Debug.Log("renderTime :" + UnityStats.renderTime);            fpsList.Add(fps);            timeleft = updateInterval;        }        if (outputTime > outputInterval)        {            Debug.Log("fps :" + AverageNumber);            AverageNumber = GetAverageNumber(fpsList);            Debug.Log("AverageNumber :" + AverageNumber);            MedianNumber = GetMedianNumber(fpsList);            Debug.Log("MedianNumber :" + MedianNumber);            varianceNumber = GetvarianceNumber(fpsList);            Debug.Log("varianceNumber :" + varianceNumber);            outputTime = 0;            fpsList.Clear();        }    }    void OnGUI()     {    //GUILayout.Label("" + fps.ToString("f2") + " FPS");   // GUILayout.Label("" + AverageNumber.ToString("f2") + " Average");   // GUILayout.Label("" + MedianNumber.ToString("f2") + " Median");  //  GUILayout.Label("" + varianceNumber.ToString("f2") + " variance");    } float number1; float number2; float number3; float GetMedianNumber(List<float> NumL)   //中位数  {        NumL.Sort ();      if( NumL.Count % 2 == 0 )       {           number1 = NumL [NumL.Count / 2];           number2 = NumL [(NumL.Count / 2) - 1];           number3 = (number1 + number2) / 2;           return number3;       } else       {           number3 = NumL [(int)(NumL.Count / 2)];           return number3;       }  } float number4 = 0; float GetAverageNumber(List<float> NumL)  //平均数  {       number4 = 0;      for(int a = 0;a < NumL.Count; a++)       {        number4+= NumL[a];       }      return (number4/NumL.Count);  } float averageN; float sum; float GetvarianceNumber(List<float> NumL)   //方差  {      sum = 0;      averageN = GetAverageNumber (NumL);      for(int a = 0;a < NumL.Count; a++)       {         sum += Mathf.Pow((NumL [a] - averageN),2);       }      return sum / NumL.Count;  }}

如果感觉上面代码计算的不准确,可以使用以下Unity 官方插件中,计算Fps的方法。

using System;using UnityEngine;using UnityEngine.UI;[RequireComponent(typeof (Text))]public class FPSCounter : MonoBehaviour{    const float fpsMeasurePeriod = 0.5f;    private int m_FpsAccumulator = 0;    private float m_FpsNextPeriod = 0;    private int m_CurrentFps;    const string display = "{0} FPS";    private Text m_Text;    private void Start()    {        m_FpsNextPeriod = Time.realtimeSinceStartup + fpsMeasurePeriod;        m_Text = GetComponent<Text>();    }    private void Update()    {        // measure average frames per second        m_FpsAccumulator++;        if (Time.realtimeSinceStartup > m_FpsNextPeriod)        {            m_CurrentFps = (int) (m_FpsAccumulator/fpsMeasurePeriod);            m_FpsAccumulator = 0;            m_FpsNextPeriod += fpsMeasurePeriod;            m_Text.text = string.Format(display, m_CurrentFps);        }    }}