代码如下,只是用到OnGUI和帧运算:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class FPSShow : MonoBehaviour
{
/// <summary>
/// 刷新的时间间隔
/// </summary>
public float timerInterval = .5f;
/// <summary>
/// 是否显示
/// </summary>
public bool isShow = true;
private float leftTimer = 0;
/// <summary>
/// 在区间内绘制帧
/// </summary>
private int frames;
/// <summary>
/// FPS在间隔时间内累积
/// </summary>
private float accum = 0;
/// <summary>
/// 文本数据缓存
/// </summary>
private string textData = null;
private GUIStyle guiStyle = new GUIStyle ();
/// <summary>
/// 区域
/// </summary>
private Rect posSize;
/// <summary>
/// 是否提示
/// </summary>
private bool already_Tip = false;
/// <summary>
/// 数量
/// </summary>
int low_cout = 0;
void Start ()
{
// #if UNITY_EDITOR||UNITY_STANDALONE_WIN
// #else
// Destroy(this);
// return;
// #endif
DontDestroyOnLoad (gameObject);
leftTimer = timerInterval;
//文本默认颜色
guiStyle.normal.textColor = Color.red;
//文字大小
guiStyle.fontSize = 12;
//显示区域
posSize = new Rect (0, 0, 70, 50);
}
void Update ()
{
++frames;
leftTimer -= Time.deltaTime;
accum += Time.timeScale / Time.deltaTime;
//间隔结束 那么就更新GUI文本 并开始新的间隔
if (leftTimer <= 0.0) {
//显示两个小数(f2格式)
float fps = accum / frames;
//计算粒子系统
int particleNum = CountParticleNum ();
textData = System.String.Format ("FPS:{0:F2}, 粒子数:{1:d}", fps, particleNum);
//只显示FPS
//textData = System.String.Format ("FPS:{0:F2}", fps);
if (fps < 20) {
guiStyle.normal.textColor = Color.red;
} else if (fps < 25) {
guiStyle.normal.textColor = Color.yellow;
} else {
guiStyle.normal.textColor = Color.green;
}
leftTimer = timerInterval;
accum = 0.0f;
frames = 0;
}
}
/// <summary>
/// 在GUI中显示
/// </summary>
void OnGUI ()
{
if (isShow) {
GUI.Label (posSize, textData, guiStyle);
}
}
/// <summary>
/// 计算当前场景粒子数量
/// </summary>
/// <returns>The particle number.</returns>
int CountParticleNum ()
{
int totalNum = 0;
ParticleSystem[] ps = GameObject.FindObjectsOfType <ParticleSystem> ();
foreach (ParticleSystem item in ps) {
if (item.isPlaying) {
//同屏粒子数(当前被渲染数量)
if (item.GetComponent <Renderer> () != null && item.GetComponent<Renderer> ().isVisible) {
totalNum += item.particleCount;
}
}
}
return totalNum;
}
}