Box2D是完全确定性的吗?

5
我正在使用LibGDX和Box2D编写Android游戏。我计划为其添加回合制多人游戏功能。
现在,如果在两个客户端上,我用相同的时间步长和相同的速率来进行Box2D世界模拟,并使用完全相同的初始参数启动模拟,那么当模拟结束时,两个模拟的最终状态将完全相同吗?换句话说,Box2D模拟是完全确定性的吗?
如果不是,那么这意味着每次模拟结束时,充当主机的一个客户端都必须告诉另一个客户端丢弃其最终模拟结果并使用自己的结果。

可能是Does Box2D Physics rely on the framerate?的重复问题。 - JeanLuc
1
@JeanLuc 那篇帖子上的问题涉及到不同帧率的问题。答案是“不会”。我的问题已经确认将使用固定帧率。那么模拟会是确定性的吗? - AxiomaticNexus
3个回答

6

官方FAQ引用

官方FAQ中有一段引用证实了您推断的内容:http://web.archive.org/web/20160131050402/https://github.com/erincatto/Box2D/wiki/FAQ#is-box2d-deterministic:

Box2D是确定性的吗?

对于相同的输入和二进制文件,Box2D将复现任何模拟。Box2D不使用任何随机数,也不将任何计算基于随机事件(如定时器等)。

然而,人们通常希望更严格的确定性。人们通常想知道Box2D是否可以在不同的二进制文件和不同的平台上产生相同的结果。答案是否定的。这个答案与浮点数如何在许多编译器和处理器中实现有关。如果您感到好奇,我建议阅读这篇文章:http://www.yosefk.com/blog/consistency-how-to-defeat-the-purpose-of-ieee-floating-point.html

换句话说:固定大小的浮点类型

为什么维基被删除,我不知道。人类啊。但我很高兴他把项目名称改成小写了。


3

经过调查,答案是“不行”,即使使用相同的时间步长!这个答案与浮点数计算在许多编译器和处理器中的实现方式有关。每个周期上的小差异会累加起来,导致模拟结果显著不同。


0

我设法让Box2D在一个实验中变得确定性,但这并不美观。 b2Body :: GetTransform() / SetTransform()的工作方式不允许读取变换,然后将其设置回完全相同的值。 我还必须在每个帧中删除并重新创建每个物体的接触列表。 虽然可以干净且更有效地解决这些问题,但它会增加足够的开销,以至于很难合并更改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接