计算 Unity 场景中的帧率

Calculating the frame-rate in a Unity scene

我正在使用 Unity 和 Vuforia 扩展制作一个带有增强现实的项目。我是 C# 的新手,但我一直在寻找类似于 ARToolKit 的方法 getFrame(),但我真的没有找到任何东西。

我的问题是:

  1. 我是否有必要计算场景运行的帧率?
  2. 我应该使用哪个场景对象来跟踪帧率?

就这么简单:

public float avgFrameRate;

public void Update()
{
    avgFrameRate = Time.frameCount / Time.time;
}

将此代码放在任何 MonoBehaviour 中并将其附加到场景层次结构中的任何 GameObject

请注意:这只会为您提供平均帧速率。对于更新的帧速率,其他答案已经解决了实现该帧速率的有效方法。

您需要类似计时器的东西来跟踪时间和更新屏幕所花费的时间,并据此推断出每秒绘制了多少帧。

我对 Unity 相当生疏,但我相信像 1/Time.deltaTime 这样的东西应该可以满足您的需求。

所以你会有这样的东西

public void Update()
{
    framerateThisFrame = 1/Time.deltaTime;
}

接下来您必须决定更改显示的 FPS 的频率,因为 framerateThisFrame 在每一帧中都会发生很大变化。例如,您可能希望每两秒更改一次。

编辑

您可能想要进行的一项改进是存储过去的 n 帧,并使用平均值计算 FPS,然后显示它。所以你最终可能会得到这样的结果:

public int Granularity = 5; // how many frames to wait until you re-calculate the FPS
List<double> times;
int Counter = 5;

public void Start ()
{
    times = new List<double>();
}

public void Update ()
{
   if (counter <= 0)
   {
       CalcFPS ();
       counter = Granularity;
   } 

   times.Add (Time.deltaTime);
   counter--; 
}

public void CalcFPS ()
{
    double sum = 0;
    foreach (double F in times)
    {
        sum += F;
    }

    double average = sum / times.Count;
    double fps = 1/average;

    // update a GUIText or something
}

编辑

如果您想在应用 slow-down/time 改变效果时保持一致,您甚至可以将帧时间乘以 Time.timeScale。

由于帧率可以不断变化,它会在给定的一秒钟内改变很多次。我使用了以下推荐的方法来获取当前帧率。只需将其放入新脚本中,然后将其添加到场景中新的空游戏对象即可。

float deltaTime = 0f;

void Update() {

    deltaTime += (Time.deltaTime - deltaTime) * .1f;

}

来源,包括显示方式:http://wiki.unity3d.com/index.php?title=FramesPerSecond

你应该看看 Time.smoothDeltaTime。这个 returns 一个平滑的 Time.deltaTime 值,您可以使用它,而不必使用其他答案中提到的技术之一自行平滑它。

None 这里的答案考虑了 timescale 可以在 Unity 中修改的事实,如果是,则上述所有方法都是不正确的。这是因为 Time.Delta 时间受 timescale.

的影响

因此,您需要使用 Time.unscaledDeltaTime:

int fps = 0;
void Update () {
    fps = (int)(1f / Time.unscaledDeltaTime);
}