幀率(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));
}
}