在我的游戏中,我有这样的代码。它渲染一个用作按钮的纹理:
private void drawStart(){
startTexture = new Texture(Gdx.files.internal("start.png"));
startTexture.setFilter(TextureFilter.Linear, TextureFilter.Linear);
stageStart = new Stage();
stageStart.clear();
buttonStart = new Image(startTexture);
buttonStart.setX(10);
buttonStart.setY(Gdx.graphics.getHeight()/2.75f);
buttonStart.setWidth(Gdx.graphics.getWidth()/4);
buttonStart.setHeight(Gdx.graphics.getHeight()/4);
Gdx.input.setInputProcessor(stageStart);
buttonStart.addListener(new ClickListener() {
public boolean touchDown(InputEvent event, float x, float y, int pointer, int button)
{
currentState = GameState.RESET;
startTexture.dispose();
stageStart.dispose();
return true;
}
});
stageStart.addActor(buttonStart);
stageStart.draw();
startTexture.dispose();
}
然而,每当我放入drawStart();在我的渲染方法中,Java堆和Native堆每10秒缓慢增加1。因此,如果用户将游戏留在菜单上约5分钟,游戏将在手机上崩溃。我已经测试过了,只有在渲染纹理时才会出现这种情况。
如果能帮我解决这个问题,我将不胜感激。我尝试过一个if语句,该语句声明如果rendered=0,则渲染纹理,然后将其设置为rendered 1,但不起作用。
这可能会对您有所帮助。您只需要在渲染中绘制即可。所以现在您可以在渲染方法中放入drawStart(),它只会绘制舞台,而离开屏幕时不要忘记调用dispose。
private void drawStart(){
stageStart.draw();
}
public void initialize() {
startTexture = new Texture(Gdx.files.internal("start.png"));
startTexture.setFilter(TextureFilter.Linear, TextureFilter.Linear);
stageStart = new Stage();
stageStart.clear();
buttonStart = new Image(startTexture);
buttonStart.setX(10);
buttonStart.setY(Gdx.graphics.getHeight()/2.75f);
buttonStart.setWidth(Gdx.graphics.getWidth()/4);
buttonStart.setHeight(Gdx.graphics.getHeight()/4);
Gdx.input.setInputProcessor(stageStart);
buttonStart.addListener(new ClickListener() {
public boolean touchDown(InputEvent event, float x, float y, int pointer, int button)
{
currentState = GameState.RESET;
startTexture.dispose();
stageStart.dispose();
return true;
}
});
stageStart.addActor(buttonStart);
}
public void dispose() {
startTexture.dispose();
}
您的问题是,在drawStart()
中,您正在创建新的Texture
和新的Stage
如果在每次渲染循环中都调用此操作,则将创建新的Texture
s和new Stage
(每秒约60次)
此ofc会导致内存泄漏。您应该只在构造函数或create()
或show()
方法中加载/创建Texture
和Stage
一次
还应考虑在需要时对其进行处理。以下是您需要手动处理的东西的列表
在渲染循环中,您应该只更新和绘制这些东西。
但由于你只有3个月的经验,我建议你先学习基础知识。不要急于进行游戏编程,这会扼杀你的动力
首先学习基础知识,然后从一些ASCII游戏(命令行)开始,然后可以从libgdx开始。
如果你已经为libgdx做好了准备,请阅读Wiki(至少是你需要的部分)以及一些教程(也许他们没有使用最新版本的libgdx,但概念应该或多或少相同,它应该有助于你理解它。)