LibGDX - texture.dispose() 应该先执行然后执行 batch.dispose() 吗?或者没有什么不同?

LibGDX - Should texture.dispose() execute first and then batch.dispose()? or no different?

LibGDX - texture.dispose() 应该先执行然后执行 batch.dispose() 吗?还是没有什么不同?

我有以下简单的代码。我的问题是应该 texture.dispose();在dispose()方法中先执行再执行batch.dispose()?

这是因为我们在sprite=new Sprite(texture);中传递了一个纹理引用;然后 sprite.draw(批次);

如果纹理不先销毁,则精灵或批次无法销毁。 跟引用计数有关吗?

这里是 LibGDX Assetmanger 官方网站(我会在下一阶段试用 Assetmanager):

Disposing Assets

Easy again, and here you can see the real power of the AssetManager:

manager.unload("data/myfont.fnt");

If that font references a Texture that you loaded manually before, the texture won't get destroyed! It will be reference counted, getting one reference from the bitmap font and another from itself. As long as this count is not zero, the texture won't be disposed.

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

batch.dispose() 将仅处理批处理内部资源(ShaderProgram 等)。 texture.dispose(); 将处理单个纹理。

你先调用哪个 dispose 并不重要。他们处理不相关的资源。但是你不能再使用处置纹理了。调用 sprite.draw(batch); 不适用于已处理的纹理。

AssetManager 仅计算对其加载的资产的引用。这里不用考虑了。

Stage更新:

来自 source:

public void dispose () {
    clear();
    if (ownsBatch) batch.dispose();
}

Stage 的实例上调用 dispose() 将处理其内部批次并清除所有子项 (Actors)。我更深入地研究了代码,clear() 方法中没有处理。因此,如果您想处置用于创建舞台的所有资源。即皮肤。您需要通过 AssetManager.

unload(...)dispose() 方法手动完成