unity3d - 在fixedUpdate() 中做繁重工作的后果是什么?

标签 unity3d unity5 unity3d-2dtools

我知道我是否在 update() 做的事情太多了结果是帧率低于目标帧率。但是如果我在 fixedUpdate() 中做同样的事情会发生什么?

它会导致 Unity 的物理引擎困惑,还是会导致程序崩溃?

最佳答案

答案和评论非常有帮助,但它们缺乏对我的问题的清晰、翔实的答案。每个人都知道当你在 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);
    }
}

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

我发现的主要区别在于 FixedUpdate() , Unity 的模拟 Time (游戏世界的时间)与实际时间不同步。换句话说,任何依赖于 Unity 的 Time 的函数系统将表现得好像整个世界都放慢了速度。

还:
  • 即使对于 FixedUpdate(),Unity 报告两种情况的帧速率相同在这种情况下,实际帧速率——现实世界每秒的帧数——显然要低得多。
  • 除了减速之外,碰撞检测和物理模拟逻辑似乎照常工作。应该碰撞的物体仍然碰撞;加速、施力等仍然有效。没有在 20 毫秒(Unity 的毫秒)内跳过碰撞器的刚体仍然像往常一样碰撞和反弹。
  • Maximum Allowed Timestep项目设置中的选项定义了必须绘制帧之前的最大(Unity 模拟时间)数量(我以前不知道它是做什么用的)。说明:如果我将它设置为 0.5 秒,那么无论我在两个函数中放入多少代码,逻辑更新步骤( Update() )都会在 FixedUpdate() 之后立即调用round 模拟了第 0.5 秒,然后将渲染场景。
  • 关于unity3d - 在fixedUpdate() 中做繁重工作的后果是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42273726/

    相关文章:

    c# - OnTriggerEnter2D 未一致调用

    c# - 由多个游戏对象组件组成的游戏对象的粒子系统行为不同

    algorithm - 从球体(二十面体)上的网格捕捉矢量到一个点

    c# - 为 int、float 等类型分配额外的属性以进行反射

    unity3d - 我可以在Android模拟器而不是Android手机上使用Unity remote吗?

    Unity3D:将文本添加到 PreFab

    c# - Unity Lerp 和 Slerp 移动不流畅

    c# - SceneManager.LoadSceneAsync() 中发生了什么

    unity3d - 旋转实例化预制件

    c# - OpenCV + 安卓 + Unity