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

时间:2015-06-22 12:07:16

标签: java libgdx dispose reference-counting

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

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

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

如果纹理没有先破坏,则不能破坏精灵或批处理。 它与引用计数有关吗?

这是LibGDX Assetmanger官方网站(我将在下一阶段尝试Assetmanager):

  

处置资产

     

再次轻松,在这里你可以看到AssetManager的真正力量:

     

manager.unload("数据/ myfont.fnt&#34);

     

如果该字体引用您之前手动加载的纹理,则   质地不会被摧毁!它将被引用计数,得到一个   来自位图字体的引用和来自其自身的另一个引用。只要   这个数不是零,纹理不会被处理掉。

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

1 个答案:

答案 0 :(得分:2)

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

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

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

Stage的更新:

来自source

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

dispose()的实例上调用Stage将处置其内部批处理并清除所有子项(Actors)。我更深入地研究了代码,并且在clear()方法中没有处理。因此,如果您想要处置用于创建舞台的所有资源。即皮肤。您需要使用unload(...)的{​​{1}}或dispose()方法手动执行。