Unity里C#实现一个简单的帧率计数器:
public class FPSCounter : MonoBehaviour { private const int LEVEL = 5; private const int NUMBER = 1 << LEVEL; private const int MASK = NUMBER - 1; [SerializeField] private Text text; private int index = 0; private float counter = 0.0f; private float[] memory = new float[NUMBER]; void Update() { index = (index + 1) & MASK; counter -= memory[index]; counter += Time.deltaTime;
memory[index] = Time.deltaTime; text.text = (NUMBER / counter).ToString(); } }
这个计数器需要一个UGUI的Text控件text以显示帧率,在Inspector面板设置这个text。
分析:
这个计数器构建一个环形缓存,在每帧的Update里按如下方式计数:
1.弹出环形缓存最旧的一个值(该值是很多帧以前的deltaTime),counter减去该值。
2.获取当前帧的deltaTime,counter累加deltaTime,同时把deltaTime压入环形缓存。
3.计算帧率,环形缓存的大小NUMBER(即总帧数)除以counter(即总时间)得到帧率。
注:
1.环形缓存用求余来保证索引不越界
2.由于求2的幂的余可以用按位与(&)代替,所以LEVEL是幂次数,该值影响环形缓存的大小所以不能太大。