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);
}
}
}