LibGDX - Должна ли текстура.dispose() выполняться сначала, а затем batch.dispose()? или не отличается?

LibGDX - Должна ли текстура.dispose () выполняться сначала, а затем batch.dispose ()? или не отличается?

У меня есть следующий простой код. Мой вопрос должен должен texture.dispose (); сначала выполнить, а затем batch.dispose () в методе dispose ()?

Это потому, что мы передаем ссылку на текстуру в sprite = new Sprite (texture); а затем sprite.draw (партия);

Если текстура не уничтожает первой, спрайт или пакет не могут быть уничтожены. Это связано с подсчетом ссылок?

Вот официальный сайт LibGDX Assetmanger (на следующем этапе я попробую Assetmanager):

Распоряжение активами

Опять легко, и здесь вы можете увидеть реальную силу AssetManager:

manager.unload ("данные /myfont.fnt");

Если этот шрифт ссылается на текстуру, которую вы загрузили ранее, текстура не будет уничтожена! Он будет подсчитан, получив одну ссылку из растрового шрифта, а другую - от себя. Пока это число не равно нулю, текстура не будет уничтожена.

package com.program.mydemo;

import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;

public class MyDemo extends ApplicationAdapter {

SpriteBatch batch;
Texture texture;
Sprite sprite;

@Override
public void create () {
    batch = new SpriteBatch();
    texture = new Texture("bg.png");
    sprite=new Sprite(texture);
    }

@Override
public void render () {
    Gdx.gl.glClearColor(1, 0, 0, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);       
    batch.begin();
    sprite.draw(batch);
    batch.end();
}   

@Override
public void dispose() {
    batch.dispose();
    texture.dispose();
}
@Override
public void resize(int width, int height) {
}
@Override
public void pause() {
}
@Override
public void resume() {
}
   }

1 ответ

Решение

batch.dispose() будет распоряжаться только пакетными внутренними ресурсами ShaderProgram так далее). texture.dispose(); будет распоряжаться индивидуальной текстурой.

Неважно, кем распоряжаться, вы звоните первым. Они располагают несвязанными ресурсами. Но вы больше не можете использовать расположенную текстуру. призвание sprite.draw(batch); не будет работать с удаленной текстурой.

AssetManager считает только ссылки на загруженные им ресурсы. Не нужно здесь это рассматривать.

Обновление для Stage :

Из источника:

public void dispose () {
    clear();
    if (ownsBatch) batch.dispose();
}

призвание dispose() в случае Stage утилизирует свою внутреннюю партию и очищает всех детей (Actors). Я посмотрел в код немного глубже, и в clear() методы. Так что если вы хотите распоряжаться всеми ресурсами, использованными для создания сцены. А именно кожа. Вам нужно сделать вручную unload(...) или же dispose() методы AssetManager,

Другие вопросы по тегам