提高游戏性能的物理技巧(Unity)
Unity 使用 2 个不同的 2D 和 3D 物理引擎。 Nvidia 的 PhysX 用于 3D 物理,开源项目 Box2D 用于 2D 物理。让我们看看如何正确使用它来提高游戏的整体性能。
物理系统:
Unity使用物理引擎来计算物理对象的复杂计算,求解运动方程,检测碰撞等。物理系统就像一个循环,每隔几帧运行一次。物理引擎通常在时间以固定值前进的假设下运行,并且 Unity 的两个物理引擎都以这种方式运行。
每一次迭代都称为一个时间步长。物理引擎只会使用精确的时间值来解析每个时间步长,这与渲染前一帧所花费的时间无关。这在 Unity 中称为固定更新时间步长,默认设置为 20 毫秒。
在每个新的时间步长,它都会检测到任何碰撞,然后计算对象的速度和位置。最后,将位置数据发送到 GPU。这种连续的循环会产生物体因重力而下落的错觉。
固定更新:
固定更新在物理引擎执行更新之前进行处理。 FixUpdate() 回调是定义我们希望与帧率无关的任何游戏行为的有用地方。人工智能计算通常在固定更新中解决,因为如果我们假设固定更新频率,它们往往更容易使用。
静态碰撞器和动态碰撞器:
如果一个游戏对象同时包含刚体和碰撞体组件,那么我们称它是动态碰撞体。如果我们将一个动态碰撞器碰撞到另一个,它们都会根据牛顿运动定律做出反应。
我们还可以拥有不附加刚体组件的碰撞器,这些碰撞器称为静态碰撞器。它们就像看不见的碰撞器,我们用它来触发某些东西或划定边界。
碰撞检测 :
碰撞检测系统的目标是报告两个物体是否发生碰撞。它报告简单的是/否答案。 Unity 中有三种碰撞检测设置,可以在 RigidBody 组件的碰撞检测属性中进行配置:离散、连续和连续动态。
离散是我们得到的默认碰撞。它会在每次速度时间戳上将对象传送一小段距离。然后它对任何重叠执行边界体积检查,将它们视为碰撞。
连续用于检测静态物体的碰撞。
连续动态用于检测两个快速移动物体之间的碰撞。
碰撞器:
2D 和 3D 对象有不同类型的碰撞器。
- 盒子碰撞器
- 球体碰撞机
- 胶囊对撞机
- 网格碰撞器
前三种是大多数情况下应该使用的基本类型。我们可以缩放这些碰撞器以填充对象形状。
网格碰撞器是我们拥有的最昂贵的碰撞器。它采用所应用的游戏对象的形状。我们应该避免使用它并使用复合碰撞器。
尖端 :
保持世界上所有物理对象的比例接近 (1,1,1)。
更喜欢离散碰撞检测。
禁用自动同步转换。
启用重用碰撞回调。
最大限度地减少光线投射和包围体检查。
避免使用网格碰撞器,而使用简单形状的复合碰撞器。
如果使用网格碰撞器:在其网格导入器上启用读/写标志。
添加更多层并最小化启用层碰撞矩阵的对。
将所有对象保持在世界空间位置接近 (0,0,0) 将导致更好的浮点精度,从而提高模拟的一致性。
不要对物体的质量添加任何浮动值,它应该是准确的。
调整“固定时间步长”设置(在“时间”窗口中)以减少物理更新所花费的时间。