帧速率恒定且可能不准确

时间:2013-04-18 06:41:10

标签: android unity3d game-physics frame-rate

我使用以下代码计算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)。它只是没有让步。我认为这可能是正确的,但是当我看到探查器时,我可以清楚地看到那里的起伏。所以显然它有点可疑。

我做错了吗?我从某处复制了代码(必须来自脚本wiki)。有没有其他方法可以知道正确的FPS?

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

float fps = 1.0f/Time.deltaTime;

所以我检查了Time.deltaTime的值,它在设备中是0.017常量。怎么可能这样: - /

1 个答案:

答案 0 :(得分:3)

在我看来,fps计数器是正确的,58.82的FPS是由物理时间设置的变化引起的。物理引擎可能无法在可用的时间步长(0.005,这是非常低)完成其计算,这意味着它将继续计算,直到达到最大时间步长,在您的情况下是0.017。这意味着所有帧将占用0.017加上您可能拥有的渲染/脚本的任何其他开销。 1 / 0.017等于58.82。

也许你可以通过其他方式解决物理问题,而不会降低固定的时间步长。