Box2D物理后端切换成WASM

预览 和打包不一致的问题最新的社区版应该已经解决,预览可以正确使用box2d wasm了。 至于box2d wasm和ts版本不一致的问题,我们会持续修复。

image @lealzhan 开启物理debug 停留10几分钟会出现这个

你看下这么改还会不会有问题

看了下好像是spine的内存泄漏了,每秒加100多k。导致这个报错

NewProject_3.zip (87.0 KB) 反馈一个小问题,在node已经激活的情况下添加body组件无效

这个demo 里能复现 spine 的泄漏问题吗?

@lealzhan 地形大或者复杂一点的话就会出现这个问题

image 有可能也是这个bug,你看这么改行不行

好的。我试试

或者方便给一个可以复现bug的demo,我们测一下。

3.8.2 会修复。这个bug是rigid body settype有问题,给设成static了。这个PR连同box2d的wasm和ts的stiffness damping不一致的问题也修复了。

好的,我改下看看

PhysicsDebugDraw(physics-debug-draw.ts)的一个小bug:
一个body有circle类型的子fixture时候,如果body有角度属性(节点的angle设置一下),PhysicsDebugDraw下_DrawCircle显示就不对了.
1 2

只是debugdraw显示问题,物理是正常的.
查了下代码,_DrawCircle的时候圆心位置没有做旋转变换.
可能初始实现的时候认为circle的中心就在节点的中心位置,就没有必要处理旋转变换了.

测试版本:3.8.0, 2.4.x和最新3.8.x都有类似的问题

原函数
_DrawCircle (center: b2.Vec2, radius: number): void {
const p = this._xf.p;
this._drawer!.circle((center.x + p.x) * PHYSICS_2D_PTM_RATIO, (center.y + p.y) * PHYSICS_2D_PTM_RATIO, radius * PHYSICS_2D_PTM_RATIO);
}

修改后
_DrawCircle (center: b2.Vec2, radius: number): void {
b2.Transform.MulXV(this._xf, center, _tmp_vec2);
this._drawer!.circle((_tmp_vec2.x) * PHYSICS_2D_PTM_RATIO, (_tmp_vec2.y) * PHYSICS_2D_PTM_RATIO, radius * PHYSICS_2D_PTM_RATIO);
}

正常的显示:
image

感谢反馈,会在这个PR修复。https://github.com/cocos/cocos-engine/pull/16278

请问wasm在原生下生效吗? 感觉没啥变化

我们测了这个帖子正文的那个测试例,vivo s9 安卓原生有不小的提升。你具体是怎样的场景?

做了个割草游戏, 开启wasm 400个敌人的时候IOS web(chrome和safari) 和 webdesk(windows+mac)基本都是满帧了, 但是android的web和原生都还停留在20帧, 没有wasm的时候 我记得是17帧, 如果是这样可能还得研究论坛那些RVO的实现, 我主观觉得RVO有抖动问题也没有box2d实现来的自然, 这个还没细研究

你具体物理上是在做什么运算?主角和敌人是挂载一个box collider,然后敌人和主角做碰撞检测吗?

有敌人和主角的碰撞, 主要还是敌人与敌人之间的碰撞推挤。我极限测试的时候,400个互相碰撞的刚体叠在互相挤一起基本就0帧了, 越分散帧率越高。unity叠在一起也是这个现象。

碰撞体堆集在一起很容易引起box2d内部卡顿,我们测试的情况是wasm版本相较于ts版本的box2d不太容易堆集,结算速度要快很多。不太清楚为什么你的android会出现这个情况。你可以试着换个android机测试一下?或者给个简单的demo,我们看下能不能优化下