будет ли объявление текстуры в области видимости причиной утечки памяти? - PullRequest
1 голос
/ 26 июня 2011

Интересно, не вызовет ли этот фрагмент кода утечку памяти? потому что я до сих пор не знаю, когда текстуру следует утилизировать. должна ли текстура располагаться в конце метода? или утилизировать его отдельно после неиспользования?

private void loadAssets() {
    Texture texture = new Texture(Gdx.files.internal("data/controls.png"));
    TextureRegion[] buttons = TextureRegion.split(texture, 64, 64)[0];
    left = buttons[0];
    right = buttons[1];
    jump = buttons[2];
    cubeControl = buttons[3];
    cubeFollow =  TextureRegion.split(texture, 64, 64)[1][2];
    dpad = new TextureRegion(texture, 0, 64, 128, 128);     
    batch = new SpriteBatch();
    batch.getProjectionMatrix().setToOrtho2D(0, 0, 480, 320);
}

и я не очень понимаю. почему в Java все еще есть утечка памяти?

1 Ответ

6 голосов
/ 23 августа 2011

Глядя на источник TextureRegion, он сохраняет ссылку на Texture, но на самом деле не "владеет" им - он никогда не собирается распоряжаться им сам.

Исходя из этого, вы не должны распоряжаться им в конце метода, но вы должны распоряжаться им, когда cubeFollow, cubeControl и dpad оба заканчиваются - что, я подозреваю, будет, когда закончится сам экземпляр.(Это может означать или не означать, что вам нужен финализатор - это зависит от того, имеете ли вы какой-то контроль над временем жизни этого объекта.)

Обратите внимание, что вам не нужно отдельное поле для хранения ссылки на Texture - вы можете получить его из dpad, используя dpad.getTexture().

...