物理碰撞undefined is not an object (evaluating 'colliderB.body') 报错

同一问题

同个问题

同样问题

同样问题

求解决啊。

这个位置代码加个判断进去,自定义引擎,临时处理的。

这样做 两个物体发生碰撞后 回调都没有了吧

我目前在尝试解决该问题。
已知情况是由于

_removeBody 函数调用早于 fixture的 __destroy,令fixture没法正常Destory

堆栈如下,我在尝试怎样回避。

_removeBody — src/jsb_polyfill.js:17425
__destroy — src/jsb_polyfill.js:18120
pushDelayEvent — src/jsb_polyfill.js:17279
_destroy — src/jsb_polyfill.js:18095
onDisable — src/jsb_polyfill.js:18065
disableComp — src/jsb_polyfill.js:8060
_disableChildComps — src/jsb_polyfill.js:23100
destroy — src/jsb_polyfill.js:23108:104
destroyNode — src/project.js:2245
recycleScene — src/project.js:2238
clearScene — src/project.js:2222
onRoundChange — src/project.js:2202
nextRound — src/project.js:2189
(anonymous function) — src/project.js:2138
fun — src/jsb_polyfill.js:31477:87
fun — src/jsb_polyfill.js:31484

__destroy — src/jsb_polyfill.js:18348
pushDelayEvent — src/jsb_polyfill.js:17279
_destroy — src/jsb_polyfill.js:18301
onDisable — src/jsb_polyfill.js:18286
disableComp — src/jsb_polyfill.js:8060
_disableChildComps — src/jsb_polyfill.js:23100
destroy — src/jsb_polyfill.js:23108:104
destroyNode — src/project.js:2245
recycleScene — src/project.js:2238
clearScene — src/project.js:2222
onRoundChange — src/project.js:2202
nextRound — src/project.js:2189
(anonymous function) — src/project.js:2138
fun — src/jsb_polyfill.js:31477:87
fun — src/jsb_polyfill.js:31484

这里我发现2个问题
一是 _disableChildComps 这个函数,在删除component的时候,body有可能比其对应的 Collider 更早被destroy,这就导致Collider 在destroy的时候,没法获取到body对象从而执行 DestroyFixture,导致部分对象泄露。

二是 当Fixture能稳定Destroy的时候,由于其关联的对象使用了对象池。导致 jsbinding 被误消除。

我能想到的解决方法是:
一、让对象JS层的Fixture不被GC。

在 var fixture = innerBody.CreateFixture(fixDef); 这句代码后,追加以下代码,令Fixture不被消耗。
if (cc.__bkf == undefined){ cc.__bkf = []; } cc.__bkf.push(fixture);

二、在Fixture进行Destroy的时候,先将 jsbinding解除。

修改引擎的native代码,在js_box2dclasses_b2Body_DestroyFixture 的 cobj->DestroyFixture(arg0); 改为如下代码:

    se::Object* obj = se::Object::getObjectWithPtr(arg0);
    obj->incRef();
    cobj->DestroyFixture(arg0);
    obj->clearPrivateData();
    obj->decRef();

这个问题理论上所有用到 内存池 + gc绑定的都有风险,应该在这种对象,在native端销毁的时候都先解除jsbinding

大佬 这样 不会报错了么

不会报错,引擎能正常运行

我来瞅瞅。

github.com/cocos-creator/engine/issues/2726
github.com/cocos-creator/cocos2d-x-lite/pull/1263

修改见这2个pull

1赞

修复了此问题:

https://github.com/cocos-creator/cocos2d-x-lite/pull/1264

JS的问题能否也修复?

同一个问题,你pull v1.9-release 分支最新代码验证一下。

github.com/cocos-creator/engine/pull/2727

确认一下,这个问题是导致 DestroyFixture 没有被调用哦。 而不是调用DestroyFixture 产生异常。

这个我不清楚,youyou 帮忙看看吧。

请问您修改的这两个地方我在哪里找到,从没改过源码,不知道咋整,求教求教。。。

已修改,不用回复了