LibGDX - 我的情况下AssetManager中有多少个引用被计算?

3

我创建了一个名为AssetsTest的AssetManager类。

    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个回答

2

直接引用自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都指向同一个纹理,该纹理仅共享一次并占用内存。这就是为什么你会得到ref count 1的原因。

更新

是的,texture1和texture2指向相同的对象(“bgscreen”),该对象是共享的。因此,在某种意义上,它们是指向同一内存地址的引用变量。一旦一个项目在资产管理器中加载,它可以以这种方式被重用/共享。在你的情况下,这意味着每次引用“bgscreen.png”时都不会创建新的对象。因此,你将始终获得ref count 1。

关于你问题的第二部分。澄清一些事情:Assetmanager.load本身不会加载任何资源。该方法只是将资源排队。一旦调用manager.update()或manager.isFinished 然后使用load方法排队的资源将加载到内存中。因此,如果你两次调用相同纹理的load方法,那么当你调用manager.update()时,你将得到相同对象(“bgscreen.png”)的两个引用,这是不必要的,因为通常你希望有一个共享相同对象的引用以提高效率。 如果这回答了你的问题,请不要忘记接受回答。


谢谢您的回复。然而,我现在非常困惑。texture1和texture2是引用还是Asset(bgscreen.png)是引用?另外,如果我在上面的代码中再次调用AssetsTest.load()而没有调用unload(),我将得到refCount=2。您能解释一下吗? - user1232250
谢谢。结论是texture1和texture2是Texture类的引用变量,而Asset Reference Count是存储在内存中的资产引用(例如bgscreen.png)的数量。它们是两个不同的东西。 - user1232250
不是 manager.isFinished,而是 manager.finishLoading 阻塞直到所有排队的资源都加载到内存中。 - user711807

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接