FramesPerSecond
Author: Aras Pranckevicius (NeARAZ)
Description
Use this script on a GUIText object to display a FPS (frames per second) indicator.
It calculates frames/second over a defined interval, so the displayed number does not keep changing wildly. It is also fairly accurate at very low FPS counts (<10). The frames per second remain accurate if the time scale of the game is changed.
JavaScript - FramesPerSecond.js
<javascript> // Attach this to a GUIText to make a frames/second indicator. // // It calculates frames/second over each updateInterval, // so the display does not keep changing wildly. // // It is also fairly accurate at very low FPS counts (<10). // We do this not by simply counting frames per interval, but // by accumulating FPS for each frame. This way we end up with // correct overall FPS even if the interval renders something like // 5.5 frames.
var updateInterval = 0.5;
private var accum = 0.0; // FPS accumulated over the interval private var frames = 0; // Frames drawn over the interval private var timeleft : float; // Left time for current interval
function Start() {
if( !guiText ) { print ("FramesPerSecond needs a GUIText component!"); enabled = false; return; } timeleft = updateInterval;
}
function Update() {
timeleft -= Time.deltaTime; accum += Time.timeScale/Time.deltaTime; ++frames; // Interval ended - update GUI text and start new interval if( timeleft <= 0.0 ) { // display two fractional digits (f2 format) guiText.text = "" + (accum/frames).ToString("f2"); timeleft = updateInterval; accum = 0.0; frames = 0; }
} </javascript>
CSharp HUDFPS.cs
A C# implementation of the above converted by Opless. The main difference is the colour change when FPS dips too low.
<csharp> using UnityEngine; using System.Collections;
public class HUDFPS : MonoBehaviour {
// Attach this to a GUIText to make a frames/second indicator. // // It calculates frames/second over each updateInterval, // so the display does not keep changing wildly. // // It is also fairly accurate at very low FPS counts (<10). // We do this not by simply counting frames per interval, but // by accumulating FPS for each frame. This way we end up with // correct overall FPS even if the interval renders something like // 5.5 frames.
public float updateInterval = 0.5F;
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
void Start() {
if( !guiText ) { Debug.Log("UtilityFramesPerSecond needs a GUIText component!"); enabled = false; return; } timeleft = updateInterval;
}
void Update() {
timeleft -= Time.deltaTime; accum += Time.timeScale/Time.deltaTime; ++frames; // Interval ended - update GUI text and start new interval if( timeleft <= 0.0 ) { // display two fractional digits (f2 format)
float fps = accum/frames; string format = System.String.Format("{0:F2} FPS",fps); guiText.text = format;
if(fps < 30) guiText.material.color = Color.yellow; else if(fps < 10) guiText.material.color = Color.red; else guiText.material.color = Color.green; // DebugConsole.Log(format,level);
timeleft = updateInterval; accum = 0.0F; frames = 0; }
} </csharp>