gpt4 book ai didi

java - libgdx/安卓 : graphics disappearing after the app is destroyed/paused

转载 作者:搜寻专家 更新时间:2023-11-01 08:42:51 24 4
gpt4 key购买 nike

我正在做一些测试,我意识到在我的 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);

一起使用

我还尝试创建 TextureRegion 直接加载纹理而不是 TextureAtlas(以防万一,但它应该是相同的),我得到了相同的结果。 .

有人吗?

编辑:更具体的代码:

屏幕类基础:

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;
}
}

代码只是为了展示纹理的使用,其他部分都去掉了

最佳答案

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

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

无论哪种方式,这都与丢失的 opengl 上下文无关。它刚刚关闭。如果上下文真的丢失了,那么 libgdx(以及更高版本的 android)将为您恢复它。

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

tl;dr 永远不要在 android 应用程序中使用 static

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

关于java - libgdx/安卓 : graphics disappearing after the app is destroyed/paused,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31137930/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com