[英]Box2d Memory Leak
我已經確定box2d導致內存泄漏。 僅僅20分鍾后,它占用了10%的應用程序內存,一直到50%。 游戲開始時的對象數為100,000。 這個數字(即使在GC之后)上升到150萬以上。 該應用程序不僅在Android上速度變慢,而且桌面開始運行也很糟糕。 最初運行良好,但5分鍾后開始看起來很遲鈍。 我將鏈接下面的相關代碼。 但首先,這里有更多信息:
我需要動態地改變這些物體的夾具尺寸。 所以我的解決方案是每幀破壞/重新創建適當大小的燈具。 使用box2d的共有8個對象(與下面的代碼完全相同)。 這些對象是我認為唯一潛在的泄漏點。
對於我前面提到的8個敵人對象,每個幀都調用下面的方法。 我還應該說每次調用都會將值'true'傳遞給此方法。 正如您將看到的,我正在處理燈具和形狀,因此我不確定如何發生內存泄漏。
private void createFixtures(boolean remove) {
if (remove) {
if (fixture_inner != null) {
if(body.getFixtureList().contains(fixture_inner, false)) {
body.destroyFixture(fixture_inner);
}
}
if (fixture_outer != null) {
if(body.getFixtureList().contains(fixture_outer, false)) {
body.destroyFixture(fixture_outer);
}
}
if (fixture_gap != null) {
if(body.getFixtureList().contains(fixture_gap, false)) {
body.destroyFixture(fixture_gap);
}
}
}
if (getInnerBounds() != null) {
FixtureDef fixtureDef_inner = new FixtureDef();
PolygonShape shape_inner = new PolygonShape();
shape_inner.set(getInnerBounds().getTransformedVertices());
fixtureDef_inner.shape = shape_inner;
fixtureDef_inner.filter.categoryBits = Config.CATEGORYBIT_BLOCKER;
fixtureDef_inner.filter.maskBits = Config.CATEGORYBIT_PLAYER;
fixtureDef_inner.isSensor = true;
fixture_inner = body.createFixture(fixtureDef_inner);
BlockerFixtureUserData fixtureUserData_inner = new BlockerFixtureUserData(this, gameObjects.indexOf(this, false));
fixture_inner.setUserData(fixtureUserData_inner);
shape_inner.dispose();
}
if (getOuterBounds() != null) {
FixtureDef fixtureDef_outer = new FixtureDef();
PolygonShape shape_outer = new PolygonShape();
shape_outer.set(getOuterBounds().getTransformedVertices());
fixtureDef_outer.shape = shape_outer;
fixtureDef_outer.filter.categoryBits = Config.CATEGORYBIT_BLOCKER;
fixtureDef_outer.filter.maskBits = Config.CATEGORYBIT_PLAYER;
fixtureDef_outer.isSensor = true;
fixture_outer = body.createFixture(fixtureDef_outer);
BlockerFixtureUserData fixtureUserData_outer = new BlockerFixtureUserData(this, gameObjects.indexOf(this, false));
fixture_outer.setUserData(fixtureUserData_outer);
shape_outer.dispose();
}
if (getGapBounds() != null) {
FixtureDef fixtureDef_gap = new FixtureDef();
PolygonShape shape_gap = new PolygonShape();
shape_gap.set(getGapBounds().getTransformedVertices());
fixtureDef_gap.shape = shape_gap;
fixtureDef_gap.filter.categoryBits = Config.CATEGORYBIT_BLOCKERGAP;
fixtureDef_gap.filter.maskBits = Config.CATEGORYBIT_PLAYER;
fixtureDef_gap.isSensor = true;
fixture_gap = body.createFixture(fixtureDef_gap);
BlockerFixtureUserData fixtureUserData_gap = new BlockerFixtureUserData(this, gameObjects.indexOf(this, false));
fixture_gap.setUserData(fixtureUserData_gap);
shape_gap.dispose();
}
}
玩家也有類似的方法做同樣的事情,只為玩家指定。
private void createFixture(boolean remove) {
if (remove) {
body.destroyFixture(fixture);
}
BodyDef bodyDef = new BodyDef();
bodyDef.type = BodyDef.BodyType.DynamicBody;
bodyDef.position.set(0, 0);
body = world.createBody(bodyDef);
FixtureDef fixtureDef = new FixtureDef();
CircleShape circle = new CircleShape();
circle.setRadius(getWidth() / 2);
circle.setPosition(new Vector2(0, getY() + getHeight() / 2));
fixtureDef.shape = circle;
fixtureDef.filter.categoryBits = Config.CATEGORYBIT_PLAYER;
fixture = body.createFixture(fixtureDef);
circle.dispose();
}
處理世界是我的主要游戲類。 但重要的是要注意(也許?)此游戲目前只有1個屏幕。
如果您可能需要任何其他信息,請隨時提出! 太感謝了!
我的問題是我在播放器createFixture方法中實例化一個體,每個幀都調用它來編輯夾具大小。 我把它移到了構造函數中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.