Unity性能优化5【物理篇】
1.刚体的碰撞检测属性首选离散型
离散碰撞的缺点是小物体快速移动时,有丢失碰撞的风险。此下拉菜单中,越下面的选项碰撞检测频率越高,性能消耗也显著增加。因此在选择碰撞检测类型时尽量选择离散型。
2.优化碰撞矩阵
合理标记碰撞矩阵可以减少物理引擎需要处理的碰撞数量,进而大幅度降低物理引擎的工作量。
从图中可以看出,碰撞矩阵的行将layer从高到低排列,矩阵的列将layer从低到高排列,当添加和修改layer后,碰撞矩阵也会刷新。
当处理碰撞时,物理引擎将忽略不适合此矩阵的对象,并允许对象彼此移动而不发生碰撞。启用复选框意味着在碰撞检测阶段将检查这两个层中的碰撞器,另外项目中最多有32个层。
3.避免在运行时加入和变换静态碰撞器
静态碰撞器:附加了碰撞组件没有附加刚体组件的gameObject
静态碰撞器类似于质量无穷大的物体,无论受到多打的力都不会移动,可以起到无形屏障的作用
动态碰撞器:附加了碰撞组件并且附加刚体组件的gameObject
两个动态碰撞器发生碰撞时,它们都会基于牛顿运动定律做出反应
物理引擎会自动将动态碰撞器和静态碰撞器分为两种不同的数据结构,当运行时加入和变换静态碰撞器时会重新生成该数据结构产生CPU开销,因此应避免。
4.避免运行时修改刚体属性将对象从睡眠状态唤醒
物理引擎会将刚体对象标记为休眠和唤醒两个状态,休眠对象被外力或碰撞唤醒之前将不产生CPU开销。当对象的速度小于Sleep Threshold参数时会进入休眠状态。在运行时修改刚体的任何属性会将游戏对象从睡眠状态唤醒。
5.将一些工作放到代码中减少物理开销
和碰撞/位移有关的效果值得思考在不使用物理组件的情况下是否可以实现,比如游戏中有个掉血区,可以通过检测玩家的transform.position属性来替代使用物理碰撞。
6.避免使用复杂的碰撞组件
基本体碰撞组件有较高的检测效率,复杂碰撞组件的性能消耗显著增加。碰撞总是涉及成对的对象,解决碰撞所需的工作量取决于两个对象的复杂性。两个基本体碰撞组件的性能最佳,基本体和复杂碰撞组件的性能次之,两个复杂碰撞组件的性能最差。
7.重叠而不碰撞时开启IsTrigger
游戏中常见的角色靠近传送门进行传送的实现往往是在传送门对象上加一个碰撞组件,并开启IsTrigger。其特征是只关心两个对象是否重叠,不需要两个对象之间产生力的作用,这种情况下应该开启IsTrigger开关。IsTrigger开启后,对象将被物理引擎忽略进而减少开销。