LibGDX - Сколько ссылок учитывается в AssetManager моего дела?
Я создал класс AssetManger под названием AssetsTest.
package com.program.mydemo;
import com.badlogic.gdx.assets.AssetManager;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.TextureAtlas;
public class AssetsTest {
public static AssetManager manager = new AssetManager();
public static void load() {
manager.load("bgscreen.png", Texture.class);
manager.load("menu.pack", TextureAtlas.class);
}
public static void unload() {
manager.unload("bgscreen.png");
manager.unload("menu.pack");
}
public static boolean update(){
return manager.update();
}
public static void dispose() {
manager.dispose();
}
}
Я также создал еще один класс под названием MyDemo
public class MyDemo extends Game {
private SpriteBatch batch;
private Sprite spriteStart1, spriteStart2;
private Texture texture1, texture2;
private TextureAtlas atlas1, atlas2;
private TextureRegion startRegion1, startRegion2;
private Camera camera;
private int refCount;
public void create () {
batch=new SpriteBatch();
camera = new OrthographicCamera(500,700);
AssetsTest.load();
AssetsTest.manager.finishLoading();
texture1 = AssetsTest.manager.get("bgscreen.png",Texture.class);
atlas1 = AssetsTest.manager.get("menu.pack", TextureAtlas.class);
startRegion1 = atlas1.findRegion("startbutton");
spriteStart1 = new Sprite(startRegion1);
spriteStart1.setPosition(-210/2,-150);
texture2 = AssetsTest.manager.get("bgscreen.png",Texture.class);
atlas2 = AssetsTest.manager.get("menu.pack", TextureAtlas.class);
startRegion2 = atlas2.findRegion("startbutton");
spriteStart2 = new Sprite(startRegion2);
spriteStart2.setPosition(-210/2,-150);
refCount = AssetsTest.manager.getReferenceCount("bgscreen.png");
System.out.println(refCount);
// AssetsTest.unload();
// AssetsTest.load();
// AssetsTest.manager.finishLoading();
public void render () {
Gdx.gl.glClearColor(0,0,0,1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.setProjectionMatrix(camera.combined);
batch.begin();
batch.draw(texture2, -500/2,-700/2);
spriteStart2.draw(batch);
batch.end();
}
@Override
public void dispose () {
super.dispose();
batch.dispose();
texture1.dispose();
AssetsTest.dispose();
}
}
Затем я создал две ссылки на текстурные ссылки (texture1 & texture2) для AssetsTest.manager.get(...);
RefCount 1. Почему?
Это должно быть "2", потому что у меня есть две ссылки (texture1 и texture2).
Если я попытаюсь вызвать AssetsTest.load(); дважды, я получу refCount 2. Вызов дважды из AssetsTest.load(); следует создать два объекта и хранить их по разным адресам памяти. Правильна ли моя концепция?
1 ответ
Непосредственно из документации libgdx:
Assets are reference counted. If two assets A and B both depend on another
asset C, C won't be disposed until A and B have been disposed.
Это также означает, что если вы загружаете ресурс несколько раз, он фактически будет общим и займет только один раз!
вы загружаете
texture1 = AssetsTest.manager.get("bgscreen.png",Texture.class);
а потом
texture2 = AssetsTest.manager.get("bgscreen.png",Texture.class);
и texture1, и texture2 указывают на одну и ту же текстуру, которая используется совместно и занимает память только один раз. Вот почему вы получаете счет 1.
Обновить
Да, texture1 и texture2 указывают на один и тот же объект ("bgscreen"), который является общим. Таким образом, в некотором смысле они являются ссылочными переменными, указывающими на один и тот же адрес памяти. После того, как элемент загружен в диспетчер ресурсов, он может быть использован / использован таким же образом. В вашем случае это означает, что новый объект не будет создаваться каждый раз, когда вы ссылаетесь на "bgscreen.png". Таким образом, вы всегда получите счет 1.
Что касается второй части вашего вопроса. Чтобы уточнить некоторые вещи: Assetmanager.load в своем роде не загружает никаких активов. Метод просто ставит в очередь активы. Как только вы вызовете manager.update() или manager.isFinished, только ресурсы, которые вы добавили в метод load, будут загружены в память. Так что если вы дважды вызываете load одной и той же текстуры, то при вызове manager.update() вы получите две ссылки на один и тот же объект ("bgscreen.png"), которые не нужны, потому что обычно требуется только один общий ресурс ссылка на тот же объект для эффективности. Если это отвечает на ваш вопрос, пожалуйста, не забудьте принять ответ.