繁体   English   中英

计算 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
}

编辑

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

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

float deltaTime = 0f;

void Update() {

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

}

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

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

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

因此,您需要使用Time.unscaledDeltaTime

int fps = 0;
void Update () {
    fps = (int)(1f / Time.unscaledDeltaTime);
}
IEnumerator FramesPerSecond()
{
    while (true)
    {
        yield return new WaitForSeconds(1);
        Debug.LogFormat("Fps {0}", Time.frameCount/Time.time);

    }

}

private void Start()
{
    StartCoroutine(FramesPerSecond());
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM