Is Box2D perfectly deterministic?

若如初见. 提交于 2019-12-04 09:42:16

After looking around, the answer is "No", even if the same time steps are used! The reason for this answer has to do with how floating point math is implemented in many compilers and processors. Small discrepancies on each cycle add up resulting in significantly different simulations.

Official FAQ quote

The official FAQ now has a quote that confirms what you deduced https://github.com/erincatto/Box2D/wiki/FAQ/933830ba42bce329a6697212050da00c383f1e79 :

#Determinism ##Is Box2D deterministic? For the same input, and same binary, Box2D will reproduce any simulation. Box2D does not use any random numbers nor base any computation on random events (such as timers, etc).

However, people often want more stringent determinism. People often want to know if Box2D can produce identical results on different binaries and on different platforms. The answer is no. The reason for this answer has to do with how floating point math is implemented in many compilers and processors. I recommend reading this article if you are curious: http://www.yosefk.com/blog/consistency-how-to-defeat-the-purpose-of-ieee-floating-point.html

I managed to make Box2D deterministic for an experiment but it was not pretty. The way b2Body::GetTransform()/SetTransform() works does not allow reading the transform and then setting it back to the exact same values. I also had to delete and re-create the contact list for each body every frame. It would be possible to fix these cleanly and more efficiently but it would add enough overhead it would be hard to get the change merged.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!