在我的游戏中,我有这个代码。它呈现一个用作按钮的纹理:
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堆和原生堆每10秒缓慢增加1。因此,如果用户在菜单上离开游戏约5分钟,游戏将在他们的手机上崩溃。我测试了它,它只在渲染纹理时才会发生。
我很感激有任何帮助解决这个问题。我已经尝试了if语句,声明如果渲染= 0,渲染纹理然后设置渲染1但是没有用。
答案 0 :(得分:0)
您的问题是,drawStart()
您正在创建新的Texture
和新Stage
。
如果你在每个渲染循环中调用它,你可以创建新的Texture
和new Stage
约60次/秒。
这会导致内存泄漏。
您应该只在构造函数或Texture
或Stage
方法中加载/创建create()
和show()
一次。
还要考虑在需要时处理它们。 Here是您需要手动处理的事项列表
在渲染循环中,您应该只更新和绘制事物。
但是,由于您只有3个月的经验,我建议您先学习基础知识。不要急于进行游戏编程,这会扼杀你的动力 首先学习基础知识,然后从一些ASCII游戏(命令行)开始,然后你可以从libgdx开始。
如果你准备好了libgdx,请阅读Wiki(至少你需要的部分)以及一些tutorials(也许他们不使用最新版本的libgdx,但这个概念应该或多或少相同,它应该有助于你理解它。)
答案 1 :(得分:0)
这可能会对你有所帮助。您只需要在渲染中绘制。所以现在你可以在你的渲染方法中放置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();
}