说到基于关节的物体,布娃娃使非常受欢迎的特性,但是即使允许多个布娃娃同时在场景中共存使非常有人的事情,但是当有太多布娃娃在运动或者与其他对象碰撞的时候,由于迭代器需要很高的迭代次数来解决这些问题,这就会带来巨大的性能损失,所以接下来讨论一下提高布娃娃性能的方法;

减少关节和碰撞器

Unity 在GameObject->3DObject->Ragdoll…下提供了简单的布娃娃生成工具,该工具可以从给定的对象中生成布娃娃,直接将给定对象的对应部位拖到上面既可以了

unity2D骨骼动画 用3D做 unity大量骨骼动画优化_性能优化


这个工具通常创建13个不同的碰撞器并且关联关节(骨盆、胸部、头部、每条手臂各两个碰撞器,每条大腿三个碰撞器),但是使用七个碰撞器(骨盆、胸部、头部、和每个肢体各一个),可以大大的降低消耗成本,代价是降低了布娃娃的真实性;

避免布娃娃之间的碰撞

当允许布娃娃之间能够发生碰撞的时候,布娃娃的性能成本呈指数级增长,因为任何关节碰撞都要求处理器计算应用于所有连接到他的关节的合成速度,这样两个布娃娃必须完成多此计算,如果布娃娃多个部分可能在一次碰撞中彼此相撞,情况又会变得更加复杂,最简单的方法就是通过碰撞矩阵取消布娃娃之间的碰撞;

更换、禁用、移除不活跃的布娃娃

在某些游戏中,一旦布娃娃达到它的最终目的地,就不再需要她作为一个可交互的对象留在游戏世界里,所以当不再需要布娃娃的时候,可以禁用、销毁、或者使用更加简单的替代品去替换他,(通常可以使用一个只包含七个关节的更简单版本去完成替换),如果需要一些对象跟踪所有的布娃娃,可以通过Rigidbody.IsSleeping观察每个布娃娃是否休眠,在对其进行相应处理;
无论采取什么方式提高游戏中布娃娃的性能,通过实例化更少的布娃娃、给他们更少的复杂性、还是给他们更短的寿命、这些都是合理的折中办法;