Unity中的经典物理系统是基于nvidia的PhysX,在推出了ECS(DotsSystem)后,加入了另外两套物理系统:Unity开发的Unity Physics和大名鼎鼎的Havok Physics
这两套物理系统和轻松的在Simulate Type设置里切换。
那么Unity Physics和Havok Physics到底有什么不同呢?
除了Havok需要Unity Pro/Enterprise之外购买单独的license之外,两者最大的不同是Unity Physics属于Stateless System,Havok是传统的Stateful System。
在物理引擎中,state(状态)一般指在系统里某一个时间点物体的物理性质。比如说气体当前的状态可以被气压温度等等决定。
Stateless系统物体的状态并不取决于上一个状态,换句话说,这个物体并不记录它的历史状态,它当下的状态决定了它即将要做的行动。无状态意味着,每帧都重新计算当前物理状态。举例说,一个滚下山的球,最终会停在某处,无论它之前的速度和位置如何,它都会最终停下来,就算扔的时候力气大或者小,或者中途经过几次反弹,最终它都会停止。
Stateful 意思现在状态和它之前的行为有关,还是球的例子,在滚下山的时候,它的每一时刻的速度都和从山上扔它的初速度相关联,也就是说初始推力的大小和它后续的行为有关。Stateful系统内部会维护前一帧碰撞状态。
关于Stateless,Unity的官方文档的介绍如下
Modern physics engines maintain large amounts of cached state in order to achieve high performance and simulation robustness. This comes at the cost of added complexity in the simulation pipeline which can be a barrier to modifying code. It also complicates use cases like networking where you may want to roll back and forward physics state. Unity Physics forgoes this caching in favor of simplicity and control.
Stateless 的问题
Stateless系统在表现一堆物体摩擦力的时候模拟的结果不是很准确。可以参考这个forum以及Unity官方视频里面有一段专门介绍了stacking的问题。Unity Learning官方也有介绍这个问题。
Unity出了一个Enable Contact Solver Stabilization Heuristic选项来解决这个问题,但是依然不是很理想
Stateless的好处
Stateless不维护之前帧的状态,意味着在网络同步的时候可以节省大量的资源,重现的时候计算量也会更小。
Havok的好处
Havok已经经过各种以开发完成的游戏的检验,在模拟大量物体的互动的时候计算量并不太大,也适用于比较复杂的环境。并且可以Customize(好像需要另外买license)。
如何选择
如果不使用ECS的话只能选择PhysX。
如果使用ECS系统如果是单机游戏,不需要网络同步的话选择Havok会比较保险,如果是Multiplayer游戏的话,Unity physics会比较方便。
参考:
https://www.zhihu.com/question/512276758
https://docs.unity.cn/Packages/com.unity.physics@1.0/manual/concepts-simulation.html
文章评论