求助:同屏两百个刚体碰撞,微信小游戏卡得要命。

我们团队做了一个物理游戏,大概流程是这样的,大怪物有五六十个,会源源不断的出现,但最多不会超过六十个,每个大怪物死后会分解成三个小怪物,每个小怪物死后会掉出三件物品,都有是刚体。在浏览器上预览基本是满帧60左右,但到微信小游戏上,瞬间帧率就掉到只有几了,而且物理效果也基本没有了。
我们目前优化的办法是:
1.降低物理步长,设置成了1/30
2.drawCall优化,整个游戏界面稳定在十几个drawcall,所有UI界面都是1个drawcall,渲染应该没有压力。
3.严格的碰撞分组,不需要相互碰撞检测的没有勾选。
4.大怪物的碰撞盒用的矩形,小怪物和掉落物品用的圆形,没有任何多边形碰撞盒。
5.使用了对象池,每个对象都是从对象池取出并回收的,回收都是隐藏节点,没有调用removeFormParent或者addChild(第一次取出的时候会调用一次)
5.所有label都用的BM字体,没用任何系统字体
我们做了这些优化,在浏览器上预览基本上一点都不卡,dc稳定在十几个,FPS稳定在60,GameLogic一般是2-5ms左右,但是打包到微信小游戏后,直接卡成狗,dc还是十几个,FPS在10以下,GameLogic为两百多ms,感觉应该是碰撞物体太多导致的卡顿,请问一下论坛的各位大佬,除了上面这些优化方案,像我们这种类型的游戏,还能怎么优化才能在微信小游戏上正常跑起来?
拜谢!!!!

1赞
  1. 会不会有可能是刚进入这个场合时,一次性创建太多节点导致吗?如果是的话,考虑提前创建或者利用协程做分帧创建
  2. 会不会是碰撞时,代码逻辑过于复杂,或者调用太多 cc.loader.loadxxx 之类的方法吗

你好,我们的游戏刚进入场景的时候大怪是一个一个出现的,最快0.5秒一个,所以不存在一次性创建太多节点。
然后我们没有调用任何 cc.loader.loadxxx 之类的东西,浏览器上一点不卡,手机微信小程序卡到爆炸。

但是运行到大怪小怪和掉落物品越来越多的时候,就开始卡了、

这个时候,dc还是维持在十几的范围内吗?
对了,会不会是有修改zIndex的操作呢?

是的,dc一直都只有十几,我们也没有修改zIndex,帧率低的时候那个GameLogic比较高,两百多的样子。

我们的游戏逻辑也并不复杂,检测到碰撞后调用对象池的回收,同时从对象池取出三个小的显示出来。没有其他逻辑

微信上面ios没有jit,所以跑这种运算量高的东西性能会很差,而且发热十分严重

请问一下,修改zIndex会对性能有什么影响吗??

IOS反而还好,安卓才是真的卡成狗!

有官方大佬能够帮帮忙吗?给我优化思路呗

我写的捕鱼也是这样,调试发现是碰撞检查这一块性能有问题,你可以试着把碰撞检查先关掉,定位问题是不是发生在这里。我是在浏览器一点不卡,但是在原生上就卡成狗。

BMFont有问题,创建速度极慢,暂时没有去排查该问题。可以采用Label.CacheMoel.CHAR模式。

微信小游戏环境性能很低下,所以不建议有很多的节点!尤其是要耗时计算的节点,你这里肯定是物理引擎导致的计算耗时卡顿。所以game logic耗时占比很高,并且刚体节点越多越卡。

这里我想过但是没有实践过,碰撞用四叉树算法
物理用自己写的物理公式来模拟。

其实就是减少计算压力和遍历计算的压力

3赞

碰撞组建有两种,普通碰撞组建,物理(刚体)组建。你用钢体碰撞组建就把普通碰撞组建全去掉。应该是你碰撞检测性能出问题了。

刚体不能太多,不在屏幕内的角色逻辑休眠吧

我这也是同屏几百个刚体,只能用空间换时间

我全部都是刚体的碰撞组件,没有用普通的碰撞组件

请问,如何判断某个节点是否在摄像机范围内?

能详细解释一下么?如何用空间换时间。