恒定但可能不准确的帧率

4
我正在使用以下代码来计算Unity3d 4.0中的帧率。它被应用于一个NGUI标签。
void Update () {
        timeleft -= Time.deltaTime;
        accum += Time.timeScale/Time.deltaTime;
        ++frames;

        // Interval ended - update GUI text and start new interval
        if( timeleft <= 0.0 )
        {
            // display two fractional digits (f2 format)
            float fps = accum/frames;
            string format = System.String.Format("{0:F2} FPS",fps);
            FPSLabel.text = format;
                timeleft = updateInterval;
                accum = 0.0F;
                frames = 0;
            }
    }

之前它似乎工作正常。然后我遇到了一些物理问题,所以我将固定时间步长更改为0.005,最大时间步长更改为0.017。是的,我知道它太低了,但我的游戏在这个上运行良好。
现在的问题是上述FPS代码始终返回58.82。我已经在不同设备上检查过(Android)。它就是不变。我认为它可能是正确的,但当我看到分析器时,我可以清楚地看到那里的起伏。很明显,有些可疑的东西。

我做错了什么吗?我从某个地方复制了代码(可能是来自脚本维基)。还有其他方法可以知道正确的FPS吗?

通过参考this questions,我已经尝试了第一个答案中的所有方法。即使以下代码也返回恒定的58.82 FPS。这只发生在Android设备上。在编辑器中,我可以看到fps的差异。

float fps = 1.0f/Time.deltaTime;

所以我检查了Time.deltaTime的值,发现在设备上是一个恒定的0.017。这可能怎么可能啊 :-/

1个回答

3
我觉得fps计数器是正确的,FPS为58.82是由于你的物理时间设置发生了变化。物理引擎可能无法在可用的时间步长(0.005,非常低)内完成其计算,这意味着它将继续计算直到达到最大时间步长,在你的情况下是0.017。这意味着所有帧都将花费0.017加上任何其他来自渲染/脚本的开销。而1 / 0.017恰好等于58.82。 也许你可以通过其他方式修复你在物理方面遇到的问题,而不必降低固定时间步长这么多。

那我只需要增加固定时间步长吗?最大时间步长可以保持在0.017吗? - 0xC0DED00D
@创建者 我认为那可能会有效。你可以尝试使用不同的值进行实验。你也可以在设备上直接尝试分析物理模拟需要多少毫秒,并相应地调整固定时间步长。 - alexFlorea

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接