簡體   English   中英

Box2d內存泄漏

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM