Skip to content

Instantly share code, notes, and snippets.

@st4rdog
Last active November 27, 2023 17:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save st4rdog/80057b406bfd00f44c8ec8796a071a13 to your computer and use it in GitHub Desktop.
Save st4rdog/80057b406bfd00f44c8ec8796a071a13 to your computer and use it in GitHub Desktop.
Unity C# FPS Counter - Add to any GameObject, then assign any Text using inspector.
using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class FPSCounter : MonoBehaviour
{
public enum DeltaTimeType
{
Smooth,
Unscaled
}
public Text Text;
[Tooltip("Unscaled is more accurate, but jumpy, or if your game modifies Time.timeScale. Use Smooth for smoothDeltaTime.")]
public DeltaTimeType DeltaType = DeltaTimeType.Smooth;
private Dictionary<int, string> CachedNumberStrings = new();
private int[] _frameRateSamples;
private int _cacheNumbersAmount = 300;
private int _averageFromAmount = 30;
private int _averageCounter;
private int _currentAveraged;
void Awake()
{
// Cache strings and create array
{
for (int i = 0; i < _cacheNumbersAmount; i++) {
CachedNumberStrings[i] = i.ToString();
}
_frameRateSamples = new int[_averageFromAmount];
}
}
void Update()
{
// Sample
{
var currentFrame = (int)Math.Round(1f / DeltaType switch
{
DeltaTimeType.Smooth => Time.smoothDeltaTime,
DeltaTimeType.Unscaled => Time.unscaledDeltaTime,
_ => Time.unscaledDeltaTime
});
_frameRateSamples[_averageCounter] = currentFrame;
}
// Average
{
var average = 0f;
foreach (var frameRate in _frameRateSamples) {
average += frameRate;
}
_currentAveraged = (int)Math.Round(average / _averageFromAmount);
_averageCounter = (_averageCounter + 1) % _averageFromAmount;
}
// Assign to UI
{
Text.text = _currentAveraged switch
{
var x when x >= 0 && x < _cacheNumbersAmount => CachedNumberStrings[x],
var x when x >= _cacheNumbersAmount => $"> {_cacheNumbersAmount}",
var x when x < 0 => "< 0",
_ => "?"
};
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment