据我所知,Web 的 Box2D 版本正在泄漏内存,没有删除正文,也没有删除联系人。那么我该如何解决这个问题呢?
在这里查看我的相关问题,解释如何泄漏:如何正确删除版本中的 box2d 主体:Box2dWeb-2.1.a.3,Box2D_v2.3.1r3?Box2D 错误?
据我所知,Web 的 Box2D 版本正在泄漏内存,没有删除正文,也没有删除联系人。那么我该如何解决这个问题呢?
在这里查看我的相关问题,解释如何泄漏:如何正确删除版本中的 box2d 主体:Box2dWeb-2.1.a.3,Box2D_v2.3.1r3?Box2D 错误?
这篇文章可能描述了如何修补这个问题 http://devizgl.blogspot.com/2012/03/box2d21a.html
您必须修补文件 Box2dWeb-2.1.a.3.js
步骤 1 将方法 Destroy() 添加到类 b2Body:
b2Body.prototype.Destroy = function () {
this.m_userData = null;
this.m_sweep = null;
this.m_xf = null;
this.m_linearVelocity = null;
this.m_force = null;
this.m_world = null;
this.m_prev = null;
this.m_next = null;
this.m_fixtureList = null;
this.m_controllerList = null;
this.m_jointList = null;
this.m_contactList = null;
}
步骤 2 在 b2World 类的 DestroyBody 方法末尾添加代码:
...
--this.m_bodyCount;
b.Destroy();
}
步骤 3 将此字段添加到 b2Contact 类:
...
this.m_swaped = false;
步骤 4 在 b2ContactFactory 类的 Destroy 方法中添加代码:
...
var reg = null;
if (contact.m_swaped) {
reg = this.m_registers[type2][type1];
}
else {
reg = this.m_registers[type1][type2];
}
contact.Reset();
...
步骤 5 在类 b2ContactFactory 的方法 Create 中添加代码:
...
if (reg.pool) {
c = reg.pool;
reg.pool = c.m_next;
reg.poolCount--;
// <---------------------
if (c.m_swaped) {
c.Reset(fixtureB, fixtureA);
}
else {
c.Reset(fixtureA, fixtureB);
}
// <---------------------
return c;
}
var createFcn = reg.createFcn;
if (createFcn != null) {
if (reg.primary) {
c = createFcn(this.m_allocator);
c.Reset(fixtureA, fixtureB);
c.m_swaped = false; // <------------------
return c;
}
else {
c = createFcn(this.m_allocator);
c.Reset(fixtureB, fixtureA);
c.m_swaped = true; // <------------------
return c;
}
}
...