渲染导致内存泄漏的纹理



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

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()方法中加载/创建TextureStage一次
还应考虑在需要时对其进行处理。以下是您需要手动处理的东西的列表
在渲染循环中,您应该只更新和绘制这些东西。

但由于你只有3个月的经验,我建议你先学习基础知识。不要急于进行游戏编程,这会扼杀你的动力
首先学习基础知识,然后从一些ASCII游戏(命令行)开始,然后可以从libgdx开始。

如果你已经为libgdx做好了准备,请阅读Wiki(至少是你需要的部分)以及一些教程(也许他们没有使用最新版本的libgdx,但概念应该或多或少相同,它应该有助于你理解它。)

最新更新