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() {
}
}
答案 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()
方法手动执行。