Unity 中FPS的计算公式

代码如下,只是用到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;
	}
}

  

posted @ 2018-08-07 13:04  不够自律的人  阅读(1034)  评论(0编辑  收藏  举报