FramesPerSecond

From Unify Community Wiki
Revision as of 15:07, 23 November 2011 by Tenebrous (Talk | contribs)

Jump to: navigation, search

Author: Aras Pranckevicius (NeARAZ)

Contents

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.


Note that in the web player, the frame rate is capped at 60fps by default - you can increase this by using Application.targetFrameRate.


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>

Boo FPS_Display.boo

A Boo implementation of the above converted by Philbywhizz.

<boo> import UnityEngine

class FPS_Display (MonoBehaviour):

   public updateInterval as single = 0.5
   
   private accum as single = 0 // FPS accumulated over the interval
   private frames as int = 0 // Frames drawn over the interval
   private timeleft as single // Left time for current interval
   
   def Start ():
       if(not guiText):
           Debug.Log("FPS Display needs a GUIText component!")
           enabled = false
       timeleft = updateInterval
   
   def Update ():
       timeleft -= Time.deltaTime
       accum += Time.timeScale/Time.deltaTime
       ++frames
       
       if (timeleft <= 0.0):
           fps = accum/frames
           format = System.String.Format("FPS: {0:F2}", fps);
           guiText.text = format
           
           if(fps < 30):
               guiText.material.color = Color.yellow
           elif(fps < 10):
               guiText.material.color = Color.red
           else:
               guiText.material.color = Color.green
           
           timeleft = updateInterval
           accum = 0.0
           frames = 0

</boo>

Personal tools
Namespaces

Variants
Actions
Navigation
Extras
Toolbox