
理论上来说,小球碰到边缘的刚体就会反弹,但是经常出现小球碰到边缘然后就卡死了,不报错,不报异常!!发生卡死的时候浏览器网页也卡死了,而且连碰撞回调也没有走。。。。
有大佬知道这是个什么问题吗?

理论上来说,小球碰到边缘的刚体就会反弹,但是经常出现小球碰到边缘然后就卡死了,不报错,不报异常!!发生卡死的时候浏览器网页也卡死了,而且连碰撞回调也没有走。。。。
有大佬知道这是个什么问题吗?
死循环了吧
问题是也没下对应的循坏逻辑啊
最近升到2.0.10也是这样,用物理引擎经常卡死,只能强制重启浏览器
卡死是进入死循环了啊,就是说球的边缘不止是碰到挡板,而是撞进去,由于刚体在球内部始终处于“接触”状态,反复反弹。
b2World.prototype.SolveTOI = function (step) {
// b2Island island(2 * b2_maxTOIContacts, b2_maxTOIContacts, 0, &m_stackAllocator, m_contactManager.m_contactListener);
var island = this.m_island;
island.Initialize(2 * b2_maxTOIContacts, b2_maxTOIContacts, 0, null, this.m_contactManager.m_contactListener);
if (this.m_stepComplete) {
for (var b = this.m_bodyList; b; b = b.m_next) {
b.m_islandFlag = false;
b.m_sweep.alpha0 = 0;
}
for (var c = this.m_contactManager.m_contactList; c; c = c.m_next) {
// Invalidate TOI
c.m_toiFlag = false;
c.m_islandFlag = false;
c.m_toiCount = 0;
c.m_toi = 1;
}
}
…
断点看,是卡死在上面这个for循环跳不出来了
那这得怎么搞~~
查一下是否游戏运行中改了刚体组件的scale或者大小?
应该没有
怎么解决的,我也遇到了这个问题?
把自己逻辑放在onPostSolve上处理,不要放在onBeginContact或是onEndContact 避免影响物理引擎逻辑。基本上就不会报错了
试一下 隔帧处理
碰撞之后 在下一帧修改属性 开个执行一次 0秒的定时器
很有用,不需要改引擎就避免了物理引擎内的问题,我是在 onEndContact 内修改了另一个碰撞体的分组,发现把逻辑放在 onBeginContact 中或者把 函数放在最后帧执行就没问题了,不过还是放在最后帧执行比较好,避免影响box2d
mark~
这个也影响吗?我经常这样干 