Unity可确定性定点数(软浮点)物理引擎
Unity自带的物理引擎,都是用的硬件浮点,硬件浮点有个特点,就是不同CPU,实现的标准可能不一样,导致会有误差。
也就是说,Unity自带的物理引擎,在不同平台上,模拟的效果可能会不一样。而且就算是同一机器,也可能因为浮点造成的误差,导致每次模拟的结果都不一样。
解决方法就是用软件浮点(定点数)来代替硬件浮点,不同平台,浮点的实现都是统一的方式,而且每次计算结果都是唯一,不存在误差,确定就是定点数性能要比浮点数差。
一本教如何写物理引擎的书,下面的知乎老哥实现的框架就是参考这本书
物理引擎:
- Box2D:Unity自带的2D物理引擎,不确定性
- Box2DSharp:C#版Box2D物理引擎,github上有一个定点数分支
- Physx:Unity自带的3D物理引擎,不确定性
- Bullet:Unity商店有人移植了一款支持U3D的版本,可能支持确定性模拟?还没测试:Bullet Physics For Unity | 物理 | Unity Asset Store
- Havok:Havok为Unity的DOTS做的新物理系统,可能支持确定性模拟?
- Unity Physics:Unity专为DOTS做的新物理系统,仅可在ECS模式用,在同一机器上是确定性的,但是在不同机器上还是不确定性,不过有人修改了一版,将浮点换成软浮点,实现跨平台确定性,论坛:Reddit - 深入了解任何内容 Github:Kimbatt/soft-float-starter-pack: Software implementation of floating point numbers and operations (github.com)
-
BEPUphysicsint v1:定点数C#物理引擎,目前用的人最多,但是好多年没更新了。最新的v2版据说因为用了.NET CLR导致跟Mono和IL2CPP的Unity兼容性不好。缺点是纯C#,没U3D组件支持,参考:3D定点物理引擎实战系列之 BEPUphysicsint定点数3D物理引擎使用 - 简书 (jianshu.com) 和 Unity 3D定点数物理引擎实战系列(四)基于Unity整合BEPUphysicsint物理引擎实战 - 知乎 (zhihu.com)
-
知乎网友自己实现的定点数物理引擎:Unity基于定点数的3D物理系统,可以用于帧同步 - 知乎 (zhihu.com) yingyugang/FixedPointPhysics (github.com)