AVA*_*AVT 5 unity-game-engine 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);
}
}
Run Code Online (Sandbox Code Playgroud)
我把它放在一个会在平面上不断弹跳的球体上。FixedUpdate()通过改变和 的函数Update()并比较差异来进行测试。
我发现的主要区别是,在 的情况下FixedUpdate(),Unity 的模拟Time(游戏世界的时间)延迟与实际时间不同步。换句话说,任何依赖于UnityTime系统的功能都会表现得好像整个世界都变慢了。
还:
Unity 在这两种情况下报告相同的帧速率,尽管在这种FixedUpdate()情况下,实际帧速率(现实世界每秒的帧数)显然要低得多。
除了速度减慢之外,碰撞检测和物理模拟逻辑似乎也正常工作。应该碰撞的物体仍然会碰撞;加速度、施力等仍然有效。未在 20 毫秒(Unity 的毫秒)内跳过碰撞器的刚体仍会像往常一样碰撞和反弹。
项目设置中的选项Maximum Allowed Timestep定义了必须绘制帧之前的最大数量(Unity 的模拟时间)(我以前从来不知道它的用途)。说明:如果我将其设置为 0.5 秒,那么无论我在两个函数中放入多少代码,逻辑更新步骤 ( Update()) 都会在一轮FixedUpdate()模拟第 0.5 秒后立即调用,然后渲染场景。