libgdx / Android:在应用程序被破坏/暂停后,图形消失了

问题描述 投票:2回答:2

我进行了一些测试,我发现在Nexus 5上,当我按下返回键(或房屋)时-也就是说,当上下文发生变化时-然后回到游戏中, openGL上下文丢失。

不再有纹理(显示为黑色)或UI的外观(按钮为白色)。

我以为它是由libgdx自动管理的,对吗?那为什么会这样呢?

我创建纹理的方法是通过TextureAtlas,例如

TextureAtlas atlas;
TextureRegion bg;
atlas = new TextureAtlas(Gdx.files.internal("mainMenu.atlas"));
bg = atlas.findRegion("bg");

然后与batch.draw(bg, x, y, w, h);一起使用

我还尝试创建直接加载纹理而不是TextureRegionTextureAtlas(以防万一,但应该是相同的,并且得到相同的结果...

任何人?

编辑:更具体的代码:

屏幕课程基础:

public class MainMenuScreen extends ScreenManager.Screen {

        private Game game;
    private InputMultiplexer inputMultiplexer = new InputMultiplexer();

    private MainMenuUi screenUi;
    private MainMenuView screenView;

    private TextureAtlas atlas;

    public MainMenuScreen(ConbiniGame game) {
        this.game = game;

        atlas = new TextureAtlas(Gdx.files.internal("mainMenu.atlas"));
        screenUi = new MainMenuUi(game);
        screenView = new MainMenuView(atlas);

        inputMultiplexer.addProcessor(screenUi.getInputProcessor());
        inputMultiplexer.addProcessor(screenView.getInputProcessor());

        Gdx.input.setInputProcessor(inputMultiplexer);
    }

    // ...
}

正在使用TextureAtlas的MainMenuView类...

public class MainMenuView {

    private Stage stage;
    private OrthographicCamera camera;
    private Viewport viewport;

    private TextureAtlas atlas;
    TextureRegion bg;

    public MainMenuView(TextureAtlas atlas) {
        atlas = atlas;
        bg = atlas.findRegion("bg");

        camera = new OrthographicCamera();
        camera.setToOrtho(false);
        viewport = new FitViewport(1080, 1920, camera);
        stage = new Stage(viewport);
    }

    public void update(float delta) {
        stage.act(delta);
    }

    public void render() {
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        stage.getBatch().begin();
        stage.getBatch().draw(bg, 0, 0, stage.getCamera().viewportWidth, stage.getCamera().viewportHeight);
        stage.getBatch().end();

        stage.draw();
    }

    public InputProcessor getInputProcessor() {
        return stage;
    }
}

该代码只是为了展示纹理的使用,并删除了其他部分

java android opengl-es libgdx textures
2个回答
3
投票

您没有提供足够的信息,但是您的问题很可能是由于在代码中使用static引起的。不要那样做。

[当您按下后退按钮时,您的应用程序已关闭。当您按下主屏幕按钮时,您的应用将暂停。请注意,这是两件事。因此,使用“主页”按钮时,您可能并不总是遇到此问题。这是因为在您的应用暂停时,该android可能会决定关闭它(以释放内存),但不能保证这样做。

不管哪种方式,这都与丢失的opengl上下文无关。它刚刚关闭。如果上下文确实丢失,那么libgdx(和更高版本的android)将为您恢复它。

[当您关闭应用程序然后立即再次启动它时,Android可能会为该应用程序实例重用相同的VM。这也意味着任何static变量都将具有它们在上一次运行应用程序时所具有的值。如果这些变量中的任何一个包含(可能是间接的)任何资源,那么这些资源将不再有效。

tl; dr从不在Android应用程序中使用static

最常见的错误(没有看到您的代码,这只是猜测)是使用单例来访问资产。例如。 MyGame.getInstance().assets.get("atlas",...);请勿这样做,(由于上述原因)将失败。而是将对MyGame实例的引用传递给任何需要它的类(例如Screennew MenuScreen(this);)。


0
投票

我制作第一个LibGDX游戏时遇到了相同的问题-Flappy Bird克隆-结果根本不是纹理问题,而是我用于速度的MEMBER Vector2 / Vector3变量。

为了使小鸟从给定的高度掉落,我声明:1.一个用于重力的成员int变量(初始化为-15),2.鸟位置的Vector2成员变量,初始化为(50,300),并且3.另一个用于速度的Vector2成员变量,初始化为0,0

现在,在update()方法中,我使用速度.add(0,重力)将重力作为值传递给速度的y轴参数

然后我使用Velocity.scl(dt)对其进行缩放然后,我将该速度添加到位置,然后使用速度再次对其进行缩放。 scl(1 / dt)。这最后一行是导致该错误的原因,但是由于它对于游戏的功能至关重要,因此我无法删除。我的解决方案是将速度变量从成员变量更改为局部变量,并且在游戏暂停时纹理不再消失。

© www.soinside.com 2019 - 2024. All rights reserved.