Box2D物理后端切换成WASM

Box2dTest.zip (159.7 KB)




500只怪挤压
第一张是电脑端
第二张是safari
第三张是android浏览器, 相对刚体挤压重叠要深入很多, 帧率也低

B2WheelJoint这个改后变得不一致了,在预览时完全没效果

建议不要直接去强制每一帧设置rigidBody的父节点的位置,这样box2d需要迭代很多次去计算,很容易引起rigidBody重叠。可以像这样在rigidBody上施加力,rigidBody之间不容易重叠,计算效率也要高很多。在android上也不会有问题了。

node是刚体父节点
//不推荐
this.node.setPosition(this.node.getPosition().add(new Vec3(v3.x, v3.y, 0)));

//推荐
this.node.getComponent(RigidBody2D).applyForceToCenter(new Vec2(-v3.x, -v3.y), true);

不过这个例子确实在安卓上的效率要比PC和ios上低很多。

如果你的目的是怪兽之间就是要重叠,那么建议把碰撞体设置为sensor,或者只要刚体不要碰撞体,不要让box2d去做碰撞恢复相关的计算,这个非常耗性能。

1赞

这个PR有在修复相关问题

好的 多谢
image
image
还有个问题是CircleCollider2D的offset不好使,不知道有没有人提过

已经在这个PR解决:

怪物的移动暂改成一开始给个线速度了, 安卓整体效果依然跟没有wasm加持一样,电脑端稳定60帧

我这边测试600个怪,Android VivoS9, Chrome上,ts版本物理耗时85ms,wasm版本物理5ms。

请确认下你的log是不是加载了box2d.wasm, 如果context不支持wasm我们会去加载box2d.asm.js, 性能应该比wasm要差一些。

赞同,给Playable的同学留点活路吧!

现在 spine wasm化,3.8.0版本暂时就没法做Playable了
要把所有文件打进一个html,研究了好久还没搞定 :rofl:

用cocos做Playable试玩的开发者还是不少的…

你可以改引擎,强制使用box2d.asm.js?

这是做割草吗。割草用box2d??

确实,好建议,如果单纯自己的一两个项目,改引擎完全没问题。
现在就是有很多人用cocos制作playable,面对的是很多普通开发者
有些坎是普通开发者很难跨越过去的,比如现在就有一个工具把 web-moblie 打包合并成一个html
那这个工具如果还要感知,对web-moblie进行修改引擎,适配各种引擎版本,对这个工具而言会有点奔溃,流程上非要到这一步也是无可奈何 :rofl:

后面可能会考虑让用户选择使用asm.js或者wasm,这样应该能解决你的问题

:pray: 感谢,如果 spine 也能支持就更好了,就像现在3D物理引擎那样,统一都支持。
因为也确实可能会有用户,希望要自己手动来选择,不然 wasm和js 两个版本都打包进去,根据环境是否支持来决定运行哪一个,包体会增大的。有些场景对包体会格外敏感。

感谢,仅供参考 :pray: :pray: :pray:

demo刚体设置线速度, 安卓浏览器预览就掉帧, 设置的越频繁掉的越多, 有时间麻烦再帮看看
Box2dTest.zip (210.5 KB)

目前如果人为改变node的scale,会触发box2d collider destroy 和 init 很耗性能。
这个ts和wasm的版本都存在,后续应该需要改进一下。你可以尝试用别的方式来实现类似效果。


image

这个PR优化Box2Dwasm的性能,你的这个例子(node不断scale的情况)vivo android chrome的物理执行时间由30ms降低到18ms。

好的 多谢,