我进行了一些测试,我发现在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可能会为该应用程序实例重用相同的VM。这也意味着任何static
变量都将具有它们在上一次运行应用程序时所具有的值。如果这些变量中的任何一个包含(可能是间接的)任何资源,那么这些资源将不再有效。
tl; dr从不在Android应用程序中使用static
。
最常见的错误(没有看到您的代码,这只是猜测)是使用单例来访问资产。例如。 MyGame.getInstance().assets.get("atlas",...);
请勿这样做,(由于上述原因)将失败。而是将对MyGame
实例的引用传递给任何需要它的类(例如Screen
:new MenuScreen(this);
)。
我制作第一个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)。这最后一行是导致该错误的原因,但是由于它对于游戏的功能至关重要,因此我无法删除。我的解决方案是将速度变量从成员变量更改为局部变量,并且在游戏暂停时纹理不再消失。