Box2D是完全确定的吗?

时间:2015-06-05 19:31:09

标签: android box2d multiplayer deterministic

我正在使用LibGDX和Box2D编写Android游戏。我计划为其添加回合制多人游戏功能。

现在,如果在两个客户端上,我以相同的速率以相同的时间步进Box2D世界,我在具有完全相同的初始参数的两个客户端上开始模拟,当模拟结束时,两者的最终状态将是模拟是完全一样的吗?换句话说,Box2D模拟是完全确定的吗?

如果不是,则表示每次模拟结束时,作为主持人的一个客户端必须告诉对方丢弃其最终模拟的结果并使用它。 / p>

3 个答案:

答案 0 :(得分:3)

环顾四周后,答案是“否”,即使使用相同的时间步骤!这个答案的原因与许多编译器和处理器中如何实现浮点数学有关。每个周期的小差异加起来导致显着不同的模拟。

答案 1 :(得分:1)

官方常见问题解答

官方常见问题解答现在有一个引文,用于确认您推断的内容https://github.com/erincatto/Box2D/wiki/FAQ/933830ba42bce329a6697212050da00c383f1e79

  

#Determinism ## Box2D是否具有确定性?对于相同的输入和相同的二进制,Box2D将重现任何模拟。 Box2D不使用任何随机数,也不对随机事件(如计时器等)进行任何计算。

     

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

答案 2 :(得分:0)

我设法使Box2D具有确定性,但它并不漂亮。 b2Body :: GetTransform()/ SetTransform()的工作方式不允许读取转换,然后将其设置回完全相同的值。我还必须删除并重新创建每帧每个主体的联系人列表。可能可以更整洁,更有效地修复这些问题,但会增加足够的开销,难以合并更改。