Cocos3.6 Destroy 碰撞器 性能消耗大

  • Creator 版本: 3.6

  • 目标平台:Google Chrome

  • 重现方式:Destroy自身物体,一个含有一个以上的BoxCollider2D 一个不含有。销毁自身的时候性能开销巨大无比
    使用的是Builtin物理引擎(感觉和之前2.x时代的纯Collider差不多,所以用这个,没想到性能开销这么大)

  • 首个报错:也不是啥报错,就是性能巨低,我盯着帧率看,Physics帧开销居然超过10ms,有时候甚至可以飙到50ms,直接造成游戏卡顿

  • 重现概率: 100%

希望能够让纯碰撞引擎回归,有时候不需要什么物理引擎,比如做一些塔防类游戏的时候,压根用不到物理引擎,只要能纯纯的检测碰撞就行了,但是没想到用了Builtin以后,Destroy的时候会这么吃性能,比A*寻路还吃,真没想到。
希望官方能够给一个方法,让我destroy的时候减少因为需要移除掉碰撞器所产生的巨大开销呜呜呜

部分用浏览器测出的性能参考

其实还是挺好复现的,只要找一个节点绑定多个子节点,子节点绑定多个碰撞器什么的,然后destroy这个节点,应该就能复现成功。

对象池的办法我也试过了,效果甚微。感觉只要和碰撞器相关的,销毁的时候都会产生较大的性能消耗。

1赞

如果暂时没有解决办法,我只能手搓一个碰撞器了 :sweat_smile: :sob: :sob:

遇到同样的问题了,有没有什么好的解决方案?

2d,手撸一个简单的碰撞器,应该很快
坛子现成的4叉树碰撞,看着不错

你就不要依赖官方了 自己手撸一个四叉树+加简单碰撞就行

1赞

暂时没办法,后续会考虑优化。

感谢指路 晚点研究一下

感谢指路 晚点研究一下 谢谢

如果有朋友想研究四叉树的 可以看看这篇帖子 讲的很好

1赞


改完之后更卡了 :joy:

更改之后的代码还是有问题的,在removeShape那里,添加:
shape._contacts = [];

就可以解决这个耗时问题

2赞

removeShapde 的性能,在数量大的时候还是没法避免,list的 indexOf() 方法仍然会消耗大量时间计算,为此我又在这个基础上做了修改。builtin.zip (4.8 KB)
既然这里都是数组,其实是可以在在碰撞检测的数据(BuiltinContact)里,保存其在数组中的位置,这样就可以避免使用indexOf查找位置,直接定位这个数据,更高效。

1赞

@lealzhan