天天看點

Unity3D基于OnGUI實時顯示FPS

幀率(Frame rate)是用于測量顯示幀數的量度。所謂的測量機關為每秒顯示幀數(Frames per Second,簡稱:FPS)或“赫茲”(Hz)。此詞多用于影視制作和電子遊戲。由于人類眼睛的特殊生理結構,如果所看畫面之幀率高于16的時候,就會認為是連貫的,此現象稱之為視覺暫留。

每秒的幀數(fps)或者說幀率表示圖形處理器處理場時每秒鐘能夠更新的次數。高的幀率可以得到更流暢、更逼真的動畫。一般來說30fps就是可以接受的,但是将性能提升至60fps則可以明顯提升互動感和逼真感,但是一般來說超過75fps一般就不容易察覺到有明顯的流暢度提升了。如果幀率超過螢幕重新整理率隻會浪費圖形處理的能力,因為螢幕不能以這麼快的速度更新,這樣超過重新整理率的幀率就浪費掉了。

以下是在Unity3D中顯示fps的代碼。

using UnityEngine;
using System.Collections;

[AddComponentMenu( "Utilities/HUDFPS")]
public class FPSCounter : MonoBehaviour
{
	//fps 顯示的初始位置和大小
	public Rect startRect=new Rect(512, 10f, 75f, 50f );
	//fps 過低時是否改變UI顔色
	public bool updateColor = true;
	//fps UI 是否允許拖動 
	public bool allowDrag = true;  
	//fps 更新的頻率
	public  float frequency = 0.5F;
	//fps 顯示的精度
	public int nbDecimal = 1; 
	//一定時間内的fps數量
	private float accum = 0f;
	//fps計算的時間
	private int frames = 0;
	//GUI 依賴fps的顔色 fps<10 紅色  fps<30 黃色 fps>=30 綠色
	private Color color = Color.white;
	//fps 
	private string sFPS = "";
	//GUI 的樣式
	private GUIStyle style;

	void Start()
	{
		StartCoroutine(FPS());
	}

	void Update()
	{
		accum += Time.timeScale/ Time.deltaTime;
		++frames;
	}

	IEnumerator FPS()
	{
		while( true )
		{
			//更新fps
			float fps = accum/frames;
			sFPS = fps.ToString( "f" + Mathf.Clamp( nbDecimal, 0, 10 ) );

			//更新顔色
			color = (fps >= 30) ? Color.green : ((fps > 10) ? Color.yellow : Color.red);

			accum = 0.0F;
			frames = 0;

			yield return new WaitForSeconds( frequency );
		}
	}

	void OnGUI()
	{
		if( style == null ){
			style = new GUIStyle( GUI.skin.label );
			style.normal.textColor = Color.white;
			style.alignment = TextAnchor.MiddleCenter;
		}

		GUI.color = updateColor ? color : Color.white;
		startRect = GUI.Window(0, startRect, DoMyWindow, "");
	}

	void DoMyWindow(int windowID)
	{
		GUI.Label( new Rect(0, 0, startRect.width, startRect.height), sFPS + " FPS", style );
		if( allowDrag ) GUI.DragWindow(new Rect(0, 0, Screen.width, Screen.height));
	}
}
           

繼續閱讀