unity3d - 为什么计算机/游戏物理引擎通常是不确定的?

标签 unity3d computer-science physics game-physics

多年来使用各种游戏物理引擎进行开发,我注意到在同一台机器上,我观察到两次运行之间物理模拟的结果大不相同。最近,团结引擎会这样做,即使物理是在设定的时间间隔 ( FixedUpdate ) 计算的——据我所知,它应该完全独立于帧速率。

我之前在游戏论坛上问过这个问题,被告知这是由于混沌运动造成的:参见双摆。但是,如果精确控制启动条件,即使双摆也是确定性的,对吗?在同一台机器上,浮点数学不应该以相同的方式运行吗?

我知道浮点数学准确性存在问题,但我理解这些问题(如 here 所述)在同一硬件上不是问题——浮点不准确性是否仍然是确定性的?我错过了什么?

tl;博士 :如果在同一台机器上运行模拟,使用相同的浮点数学(?),模拟不应该是确定性的吗?

非常感谢您的宝贵时间。

最佳答案

是的,你是对的。在同一台机器上执行的程序每次都会给出相同的结果(至少在理想情况下——可能有 cosmic rays 或其他影响内存的外部事物,但我会说这些不是我们关心的)。计算机上的所有计算都是确定性的,因此计算机的所有算法都必然是确定性的(这就是 it's so hard to make random number generators 的原因)!

您看到的随机性很可能是在带有一些随机数生成器的程序中实现的,并且随机数的种子因运行而异。如果您使用相同的种子开始模拟,您将看到相同的结果。

编辑:我对 Unity 不熟悉,但做更多的研究似乎表明 FixedUpdate例程可能是问题所在。

Except for the audio thread, everything in unity is done in the main thread if you don't explicitly start a thread of your own. FixedUpdate runs on the very same thread, at the same interval as Update, except it makes up for lost time and simulates a fixed time step.



source

如果是这种情况,函数本身看起来有点像:
void physicsUpdate(double currentTime, double lastTime)
{
    double deltaT = currentTime - lastTime;
    // do physics using `deltaT`
}

这里我们自然会因为deltaT得到不同的行为两个不同的运行不一样。这是由后台运行的其他进程决定的,因为它们可能会延迟主线程。这个函数会被不规则地调用,你会从运行中观察到不同的结果。请注意,这些违规行为大多会不是 是由于浮点不精确,而是由于进行积分时的不准确。 (例如,速度通常由 v = a*deltaT 计算,它假设自上次更新以来的加速度恒定。这通常不是真的)。

但是,如果函数如下所示:
void physicsUpdate(double deltaT)
{
    // do physics using `deltaT`
}

每次使用它进行模拟时,您将始终获得完全相同的结果。

关于unity3d - 为什么计算机/游戏物理引擎通常是不确定的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41063608/

相关文章:

c# - 如何将 bool 保存到 PlayerPrefs Unity

算法分析 : In practice, 高阶项的系数重要吗?

.net - F# 适合物理应用吗?

monodevelop - UnityScript 是否支持 Object Literal 语法?

c# - 在unity3d中将两个不同的纹理合并为一个

Python 编程帮助

regex - 正则表达式在理论上足够强大有什么用?

java - 抛射运动的实现

给出错误答案的 Python N 体模拟代码

c# - 游戏世界中从相机到鼠标位置的光线转换