渲染纹理导致内存泄漏

时间:2014-10-08 20:37:24

标签: java memory memory-management memory-leaks libgdx

在我的游戏中,我有这个代码。它呈现一个用作按钮的纹理:

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但是没有用。

2 个答案:

答案 0 :(得分:0)

您的问题是,drawStart()您正在创建新的Texture和新Stage
如果你在每个渲染循环中调用它,你可以创建新的Texturenew Stage约60次/秒。
这会导致内存泄漏。 您应该只在构造函数或TextureStage方法中加载/创建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();
    }