关于unity 过多碰撞器集群触发而导致卡顿原因及解决方法

unity 过多碰撞器集群时产生的卡顿原因与解决方法

在使用unity 3d制作游戏的时候,大部分情况发我们无论在Npc,还是Player上挂载很多不同功能的碰撞器,例如在射击类游戏中,当玩家走过去,需要一个检测是否进入寻找范围的碰撞器,同时,我们需要一个检测是否进入攻击范围的碰撞器,当然还需要一个是否自己被攻击的碰撞器,这样在Npc上就挂载了3个碰撞器。
1:当Npc集群时候,造成卡顿的原因
大部分时候我们利用再Npc下挂载3个空物体,然后把碰撞器挂在不同空物体上,然后利用tag,脚本就能自动检测到是触发了哪个碰撞器,当物体很少的时候,这样做是没有问题的,
但是当Npc大批量集群出现的时候就会产生很大问题。
由上面一个Npc上就要挂载3个碰撞器,假设,我们利用原型模式,建立一个MonsterFactory进行大批量生产怪物的时候,当怪物堆积到一定程度,我们再去触发,怪物会疯狂跟踪并攻击你,怪物少的时候你可能只会觉得有一点卡,但是当怪物很多的时候,就会出现卡顿,FPS会掉的很厉害,画面十分的卡。这里可能有的小伙伴觉得是电脑的问题,但是现在的电脑应该完全能带的动,开发过程中涉及到的空间运算也很平常。所以问题应该不是出现在这里。
unity有自带的profiler,就是ctrl+f7就能看到哪一块出占用时间最长,博主惊奇的发现,是大量的碰撞器被触发了,没进行优化前,每一秒大概有30W次TriggerStay被触发,27W次的ComparTag被使用。
我们先进行简单的数学分析,当物体不是很多且空间较大的时候,我们的物体挂载的碰撞器基本很小概率会被触发,但是当物体成集群的时候,一个挨着一个,假设有n个Npc,那就会产生C(3*n)2=1/2*3n*(3n-1)次触发,基本相当于平方级的增长,这是非常恐怖的,如果有100个Npc扎堆,理论上每一秒(帧率60)就会有60*1/2*180*179=1933200次的碰撞检测(这里假设是3个碰撞器范围一样大,理想情况下),里面又包括海量的CompareTag,帧率自然就会下来。
2:如何解决CompareTag与碰撞器之间的过多触发
这里的关键就是如何减少Npc碰撞器之间的碰撞,我们可以利用图层layer(unity里面可以设置)来实现,我们先将Player放入自定义图层Layer_Player里面,然后将Npc放入Layer_Npc中,这样就可以把player,与npc分离开来,这样我们就可以简化了CompareTag,甚至完全省略,这样TriggerStay就可以省略掉了,只需要一个TriggerEnter就完成了以前需要大量判断tag的工作。
接着我们处理过多碰撞器,设置图层之后,我们可以设置相同图层之间不产生碰撞,所幸unity给我们提供了这个。在最上方那一层中editor下,选择settingphysics点击后就可以选择layercollision matrix里勾选碰撞选项。
这样就可以大大简化掉碰撞,经过检测,这样操作以后我的CompareTag和trigger触发占用时间从40%降到了1.8%,处理过后也不卡了。

猜你喜欢

转载自blog.csdn.net/Grd2018/article/details/81161046