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
,