Unity基础包 工具类 FPSCounter脚本显示帧率

发表于2017-11-07
评论0 4.9k浏览

Characters包里面的内容讲完了,看了一下其他的貌似都比较复杂,这次先来个简单的吧——计算帧率,这边我还发一下我自己的一个实现。

 

我所比较疑惑的是在Game的窗口中点击Stats也会显示帧率,但这个帧率总会跟脚本测量的帧率有一定的出路,有时候甚至是一直大于我所测量的帧率的,计算方式有一些什么不同吗?

 

我们先来看看FPSCounter的脚本内容:

  1. // 帧数计算器,需要UGUI来显示,其实可以通过写在OnGUI中显示  
  2. [RequireComponent(typeof (Text))]  
  3. public class FPSCounter : MonoBehaviour  
  4. {  
  5.     const float fpsMeasurePeriod = 0.5f;    //FPS测量间隔  
  6.     private int m_FpsAccumulator = 0;   //帧数累计的数量  
  7.     private float m_FpsNextPeriod = 0;  //FPS下一段的间隔  
  8.     private int m_CurrentFps;   //当前的帧率  
  9.     const string display = "{0} FPS";   //显示的文字  
  10.     private Text m_Text;    //UGUI中Text组件  
  11.   
  12.     private void Start()  
  13.     {  
  14.         m_FpsNextPeriod = Time.realtimeSinceStartup   fpsMeasurePeriod; //Time.realtimeSinceStartup获取游戏开始到当前的时间,增加一个测量间隔,计算出下一次帧率计算是要在什么时候  
  15.         m_Text = GetComponent<Text>();  
  16.     }  
  17.   
  18.   
  19.     private void Update()  
  20.     {  
  21.         // 测量每一秒的平均帧率  
  22.         m_FpsAccumulator ;  
  23.         if (Time.realtimeSinceStartup > m_FpsNextPeriod)    //当前时间超过了下一次的计算时间  
  24.         {  
  25.             m_CurrentFps = (int) (m_FpsAccumulator/fpsMeasurePeriod);   //计算  
  26.             m_FpsAccumulator = 0;   //计数器归零  
  27.             m_FpsNextPeriod  = fpsMeasurePeriod;    //在增加下一次的间隔  
  28.             m_Text.text = string.Format(display, m_CurrentFps); //处理一下文字显示  
  29.         }  
  30.     }  
  31. }  

相信大家都是能写出来的,然后分享一个自用的FPS计数器,FPSShow:

  1. // 我的FPS显示,除了FPS显示功能外还有计算时间差功能  
  2. public class FPSShow : MyUtil   //继承MyUtil,个人习惯,表明Util层的内容,这边可以直接继承MonoBehaviour  
  3. {  
  4.   
  5.     // 单例  
  6.     private static FPSShow instance;  
  7.     public FPSShow()  
  8.     {  
  9.         instance = this;  
  10.     }  
  11.     public static FPSShow getInstance()  
  12.     {  
  13.         return instance;  
  14.     }  
  15.   
  16.     // fps  
  17.     float fpsPassTime = 0f; //fps计算经过了多少秒  
  18.     int fpsCount = 0;   //当前fps的计数  
  19.     float fps = 0f; //最终每秒的fps数量  
  20.   
  21.     // 时间差  
  22.     bool isNeedEndTime = false//是否需要计算差值时间  
  23.     float startTime = 0f;   //时间差开始的时间  
  24.     float endTime = 0f; //结束的时间  
  25.   
  26.     // 获取一次时间  
  27.     public void getEndTime()  
  28.     {  
  29.         isNeedEndTime = true;  
  30.     }  
  31.   
  32.     // 增加帧率计数,可以由外部到用,计算FixedUpdate、Update都是可以的,不过注意该函数最好只在一个地方调用  
  33.     public void calcFrame()  
  34.     {  
  35.          fpsCount;  
  36.     }  
  37.   
  38.     // 更新  
  39.     void Update ()  
  40.     {  
  41.         calcFrame();    //计算fps  
  42.   
  43.         if (!gameSystem.isDebug)  
  44.             return;  
  45.   
  46.         if (isNeedEndTime)  //需要计算差值时间,把结束的时间给开始时间,然后结束时间赋值为当前时间,最后在OnGUI中计算一个差值  
  47.         {  
  48.             startTime = endTime;  
  49.             endTime = Time.time;  
  50.             isNeedEndTime = false;  
  51.         }  
  52.   
  53.         fpsPassTime  = Time.deltaTime;  //增加fps经过的时间  
  54.         if(fpsPassTime > 2.0f)  //超过2秒了,平均一下,计算出一秒的帧率  
  55.         {  
  56.             fps = fpsCount / fpsPassTime;  
  57.             fpsCount = 0;  
  58.             fpsPassTime = 0f;  
  59.         }  
  60.     }  
  61.   
  62.     void OnGUI()  
  63.     {  
  64.         if (!gameSystem.isDebug)    //是否在debug状态,可以注释  
  65.             return;  
  66.   
  67.         // 输出黄色、40号大字,太小怕看不见(害羞)  
  68.         GUIStyle style = new GUIStyle();  
  69.         style.normal.background = null;  
  70.         style.normal.textColor = new Color(1.0f, 0.5f, 0.0f);  
  71.         style.fontSize = 40;  
  72.   
  73.         // 显示!  
  74.         GUI.Label(new Rect(Screen.width / 2 - 40, 0, 200, 200), string.Format("FPS:{0:0.00}, dTime:{1:0.0000}", fps, endTime - startTime), style);   
  75.     }  
  76. }  

本人入职第一天写了这个脚本,成功的测出了游戏的移动BUG所在,这个是最基础的,最有用的工具之一。


来自:http://blog.csdn.net/u012632851/article/details/53217603

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引