【问题标题】:Constant and probably inaccurate Frame Rate恒定且可能不准确的帧速率
【发布时间】:2013-04-18 06:41:10
【问题描述】:

我正在使用以下代码来计算 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)。它就是不动。我认为这可能是正确的,但是当我看到 profiler 时,我可以清楚地看到那里的起伏。很明显,这很可疑。

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

通过从this questions 获取线索,我已经尝试了第一个答案中的所有方法。甚至以下代码也返回恒定的 58.82 FPS。它仅发生在android设备中。在编辑器中我可以看到 fps 差异。

float fps = 1.0f/Time.deltaTime;

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

【问题讨论】:

    标签: android unity3d game-physics frame-rate


    【解决方案1】:

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

    也许您可以通过其他方式解决您在物理方面遇到的任何问题,而不会大幅降低固定时间步长。

    【讨论】:

    • 所以我只需要增加固定时间步长?我可以将最大时间步长保持在 0.017 吗?
    • @Creator 我认为这可能有效。您可以尝试不同的值。您也可以尝试直接在设备上进行分析,以查看物理模拟需要多少毫秒,并相应地调整您的固定时间步长。
    猜你喜欢
    • 2021-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 2021-12-23
    • 2014-02-24
    相关资源
    最近更新 更多