3

AssetsTest という 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 {

        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();
    }
}

次に、AssetsTest.manager.get(...); への 2 つのテクスチャ参照 (texture1 & texture2) 参照を作成しました。

refCount は 1 です。なぜですか?

2 つの参照 (テクスチャ 1 とテクスチャ 2) があるため、「2」である必要があります。

AssetsTest.load(); を呼び出そうとすると、AssetsTest.load(); を 2 回呼び出すと、refCount は 2 になります。2 つのオブジェクトを作成し、異なるメモリ アドレスに格納する必要があります。私のコンセプトは正しいですか?

4

1 に答える 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. 

これはまた、アセットを複数回ロードした場合、実際には共有され、メモリを消費するのは 1 回だけであることも意味します。

あなたがロード

texture1 = AssetsTest.manager.get("bgscreen.png",Texture.class);

その後

texture2 = AssetsTest.manager.get("bgscreen.png",Texture.class);

texture1 と texture2 の両方が、共有され、メモリを 1 回だけ使用する同じテクスチャを指します。そのため、参照カウントは 1 になります。

アップデート

はい、texture1 と texture2 は、共有されている同じオブジェクト (「bgscreen」) を指しています。したがって、ある意味では、それらは同じメモリアドレスを指す参照変数です。アイテムがアセット マネージャーに読み込まれると、この方法で再利用/共有できます。あなたの場合、これは、「bgscreen.png」を参照するたびに新しいオブジェクトが作成されないことを意味します。したがって、常に参照カウント 1 を取得します。

質問の2番目の部分に関して。いくつかのことを明確にするために: Assetmanager.load はその方法でアセットをロードしません。このメソッドは、アセットをキューに入れるだけです。manager.update() または manager.isFinished を呼び出す、load メソッドでエンキューしたアセットがメモリにロードされます。そのため、同じテクスチャの load を 2 回呼び出すと、manager.update() を呼び出すと、同じオブジェクト ("bgscreen.png") の 2 つの参照が作成されることになります。効率のために同じオブジェクトを参照します。これで質問に対する回答が得られた場合は、回答を受け入れることを忘れないでください。

于 2015-06-23T14:32:28.667 に答える