Java LibGDX-我的案例的AssetManager中计算了多少引用?
我创建了一个名为AssetTest的AssetManger类Java LibGDX-我的案例的AssetManager中计算了多少引用?,java,libgdx,reference-counting,asset-management,Java,Libgdx,Reference Counting,Asset Management,我创建了一个名为AssetTest的AssetManger类 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 {
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();
}
}
然后,我创建了对AssetTest.manager.get(…)的两个纹理引用(texture1和texture2)
引用计数为1。为什么?
它应该是“2”,因为我有两个参考(texture1和texture2)
如果我尝试调用AssetTest.load();两次,我将得到refCount为2。调用两次AssetTest.load();应创建两个对象并存储在不同的内存地址中。我的概念正确吗?直接来自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”时都不会创建新对象。所以你总是会得到ref count 1
关于你问题的第二部分。要澄清一些事情:Assetmanager.load以其方式不加载任何资产。该方法只是将资产排成队列。调用manager.update()或manager.isFinished后,使用load方法排队的资产将加载到内存中。因此,如果您两次调用相同纹理的load,那么在调用manager.update()时,您将得到同一对象的两个引用(“bgscreen.png”),这是不必要的,因为为了提高效率,您通常只需要同一对象的一个共享引用。
如果这回答了您的问题,请不要忘记接受回复。谢谢您的回复。但是,我现在很困惑。texture1和texture2是引用还是资源(bgscreen.png)是引用?另外,如果我在上述代码中再次调用AssetTest.load(),而不调用unload();,我将得到refCount=2。你能解释一下吗?谢谢。可以得出结论,texture1和texture2是纹理类的引用变量,资产引用计数是存储在内存中的资产引用数(例如bgscreen.png)。它们是两种不同的东西。不是
manager.isFinished
,而是manager.finishLoading
,直到所有排队的资产都加载到内存中为止。