计算Unity场景中的帧速率

时间:2015-08-27 14:15:43

标签: c# unity3d frame-rate

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

我的问题是:

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

5 个答案:

答案 0 :(得分:2)

你会想要一个跟踪时间的计时器,以及更新屏幕需要多长时间,以及从一秒钟内绘制多少帧的推断。

我对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
}

编辑

如果你想在应用减速/时间改变效果时保持一致,你甚至可以将帧时间乘以Time.timeScale。

答案 1 :(得分:1)

这很简单:

public float avgFrameRate;

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

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

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

答案 2 :(得分:1)

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

float deltaTime = 0f;

void Update() {

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

}

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

因此,您需要使用Time.unscaledDeltaTime

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