本文已参与「新人创作礼」活动,一起开启掘金创作之路。
本篇记录一下unity引擎中关于物理系统优化的一个小知识点。
准备阶段
首先创建一个很简单的脚本,脚本名和让物体旋转的代码如下:
然后我们创建一个立方体cube,上面挂上这个脚本,并将其保存为一个Prefab。
知识点
Unity引擎会将场景里的(带有collider的)物体分为动态物体和静态物体
| 物体类型 | 动态物体 | 静态物体 |
|---|---|---|
| 判定标准 | 有collider和rigidbody | 有collider不含有rigidbody |
| 碰撞网格计算 | 会重新计算物体的碰撞 | 发生变换时会对所有静态物体重新生成静态碰撞网格的缓存数据 |
当unity中任何一个静态collider对象的碰撞网格发生变化的时候,unity会重新计算生成所有静态碰撞网格并重新缓存。
我们的脚本会让这个cube的静态网格发生变换,unity就会一直进行静态网格的计算和缓存重写。
经验
如果一个物体只需要做碰撞检测,而不需要实际的物体效果,可以将rigidbody中的is Kinematic选项勾选。勾选后,物体发生位移、变型等,也不会触发重新计算所有静态碰撞网格并重写缓存的运算逻辑。(但是由于挂了rigidbody也有额外性能开销)
验证效果对比
预制体勾选 is Kinematic后的效果和不勾选的区别,可以利用unity自带的profiler工具进行对比(不过需要很大量的预制体在场景中,对比效果才明显)。
这里创建了72个这样的cube预制体,并且只有collider没有rigidbody
下面是挂上rigidbody并且勾选了is Kinematic,看上去效果并不明显。
下面是我弄了720个预制体,没有挂rigidbody:
下面是720个预制体都挂上rigidbody并且勾选了is Kinematic(感觉差别也不大,反而这个性能消耗更大了):
最后来测一次,这次弄5760个预制体
电脑都给我高卡咯。
不挂rigidbody
不行5760个挂了rigidbodyUnity打都打不开,换成2240个预置体。
不挂rigidbody
挂rigidbody
看来验证效果对比和理论的不一样,带我去研究研究为啥,再回来继续这篇文章。
上面是我对比的时候控制变量不对,变动了2个因素,rigidbody组件 和is Kinematic开关两个都不一样了。 下面重新对比:
挂上rigidbody不设置is Kinematic
低峰:大概35到40ms
高峰:大概180-190ms
开启is Kinematic后
低峰:大概50ms
高峰:大概130ms