Aar*_*ier 8 computer-science physics unity-game-engine game-physics
多年来使用各种游戏物理引擎进行开发,我注意到在同一台机器上,我观察到在运行之间的物理模拟中有很多不同的结果.最近,Unity引擎执行此操作,即使物理是按照设定的时间间隔计算的(FixedUpdate
) - 据我所知,它应该完全独立于帧速率.
我之前在游戏论坛上问了这个问题,并被告知这是由于混乱运动:看到双摆.但是,如果起始条件得到精确控制,即使双摆也是确定性的,对吗?在同一台机器上,不应该浮点数学表现方式相同吗?
据我所知,有与浮点运算精度问题,但我明白这些问题(如概括这里)不上的问题,同样的硬件 -没有浮点误差还是确定性?我错过了什么?
tl; dr:如果在同一台机器上运行模拟,使用相同的浮点数学(?),模拟是否应该是确定性的?
非常感谢您的宝贵时间.
是的,你是对的。在同一台机器上执行的程序每次都会给出相同的结果(至少在理想情况下,可能存在宇宙射线或其他影响内存的外部事物,但我想说这些不是我们关心的)。计算机上的所有计算都是确定性的,因此计算机的所有算法也必然是确定性的(这就是随机数生成器如此困难的原因)!
您看到的随机性很可能是在程序中使用一些随机数生成器实现的,并且随机数的种子每次运行都不同。如果您使用相同的种子开始模拟,您将看到相同的结果。
编辑:我对 Unity 不熟悉,但做一些更多的研究似乎表明例程FixedUpdate
可能是问题所在。
除了音频线程之外,如果您没有显式启动自己的线程,则 Unity 中的所有内容都将在主线程中完成。FixUpdate 在同一个线程上运行,与 Update 的时间间隔相同,只是它弥补了损失的时间并模拟了固定的时间步长。
如果是这种情况,函数本身看起来有点像:
void physicsUpdate(double currentTime, double lastTime)
{
double deltaT = currentTime - lastTime;
// do physics using `deltaT`
}
Run Code Online (Sandbox Code Playgroud)
deltaT
在这里,由于两次不同运行的行为不相同,我们自然会得到不同的行为。这是根据后台运行的其他进程确定的,因为它们可能会延迟主线程。该函数将被不规则地调用,并且您会观察到不同的运行结果。请注意,这些不规则性大多不是由于浮点不精确造成的,而是由于积分时的不准确造成的。(例如,速度通常由 计算v = a*deltaT
,它假设自上次更新以来加速度恒定。这通常是不正确的)。
但是,如果该函数如下所示:
void physicsUpdate(double deltaT)
{
// do physics using `deltaT`
}
Run Code Online (Sandbox Code Playgroud)
每次使用它进行模拟时,您总是会得到完全相同的结果。
归档时间: |
|
查看次数: |
2288 次 |
最近记录: |