在fixedUpdate()中做繁重的工作会有什么后果?

AVA*_*AVT 5 unity-game-engine unity3d-2dtools

我知道如果我做太多事情,update()结果会将帧速率降低到目标帧速率以下。但如果我在 中做同样的事情会发生什么fixedUpdate()?

它会导致 Unity 的物理引擎混乱,还是会使程序崩溃?

AVA*_*AVT 2

答案和评论非常有帮助,但它们对我的问题缺乏清晰、翔实的答案。每个人都知道,当你在循环中投入过多的工作负载时FixedUpdate(),会发生不好的事情,我的问题是问那时会发生什么不好的事情。

自从我终于接触到计算机后,我决定自己做一些测试。仅供参考,这是我用来测试的:

public class TestFixedUpdate : MonoBehaviour {
    public int loopNo = 500000;

    private int noOfCall = 0;
    private int collisionTimes = 0;

    private void FixedUpdate()
    {

        if (noOfCall > 100) return;
        float time = Time.timeSinceLevelLoad;

        for (int i = 0; i < loopNo; i++) {
            Quaternion.Slerp(Quaternion.identity, Quaternion.FromToRotation(Vector3.up, Vector3.forward), Mathf.Abs(Mathf.Sin(Time.timeSinceLevelLoad)));
        }

        Debug.Log(Time.timeSinceLevelLoad.ToString("0.00"));

        if (noOfCall > 99) Debug.Log("Simulation finished. Times collided:" + collisionTimes);

        noOfCall++;
    }

    private void OnCollisionEnter(Collision collision)
    {
        if (noOfCall > 100) return;
        collisionTimes++;
        Debug.Log("Times collided:" + collisionTimes);
    }
}
Run Code Online (Sandbox Code Playgroud)

我把它放在一个会在平面上不断弹跳的球体上。FixedUpdate()通过改变和 的函数Update()并比较差异来进行测试。

我发现的主要区别是,在 的情况下FixedUpdate(),Unity 的模拟Time(游戏世界的时间)延迟与实际时间不同步。换句话说,任何依赖于UnityTime系统的功能都会表现得好像整个世界都变慢了。

还:

  1. Unity 在这两种情况下报告相同的帧速率,尽管在这种FixedUpdate()情况下,实际帧速率(现实世界每秒的帧数)显然要低得多。

  2. 除了速度减慢之外,碰撞检测和物理模拟逻辑似乎也正常工作。应该碰撞的物体仍然会碰撞;加速度、施力等仍然有效。未在 20 毫秒(Unity 的毫秒)内跳过碰撞器的刚体仍会像往常一样碰撞和反弹。

  3. 项目设置中的选项Maximum Allowed Timestep定义了必须绘制帧之前的最大数量(Unity 的模拟时间)(我以前从来不知道它的用途)。说明:如果我将其设置为 0.5 秒,那么无论我在两个函数中放入多少代码,逻辑更新步骤 ( Update()) 都会在一轮FixedUpdate()模拟第 0.5 秒后立即调用,然后渲染场景。