我写了这3个类来测试它们在android上。如果我只是按菜单按钮并隐藏应用程序,然后再次打开它,然后再次隐藏并重新打开它,每次我隐藏应用程序时ram使用量都会增加。
如果我只是在应用程序内部的类之间切换,应用程序使用越来越多的内存,就会出现同样的问题。
我正在寻找这个问题的解决方案,我在yotube上看过教程,但我还没找到。我不明白这里可能出现的问题。
有人可以解释我做错了什么吗?
public class MyEF extends Game {
@Override
public void create() {
setScreen(new TestScreen1(this));
}
@Override
public void dispose() {
super.dispose();
}
@Override
public void render() {
super.render();
}
@Override
public void resize(int width, int height) {
super.resize(width, height);
}
@Override
public void pause() {
super.pause();
}
@Override
public void resume() {
super.resume();
}
}
// TEST1
public class TestScreen1 implements Screen {
private MyEF game;
public TestScreen1(MyEF game) {
this.game = game;
}
@Override
public void render(float delta) {
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
if(Gdx.input.justTouched()){
game.setScreen(new TestScreen2(game));
dispose();
System.out.println("TOUCHED ");
}
}
@Override
public void show() {
}
@Override
public void dispose() {
game.dispose();
}
@Override
public void hide() {
}
@Override
public void pause() {
}
@Override
public void resume() {
}
@Override
public void resize(int width, int height) {
}
}
// TEST2
public class TestScreen2 implements Screen {
private MyEF game;
public TestScreen2(MyEF game) {
this.game = game;
}
@Override
public void render(float delta) {
Gdx.gl.glClearColor(1, 1, 1, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
if(Gdx.input.justTouched()){
game.setScreen(new TestScreen1(game));
dispose();
System.out.println("TOUCHED ");
}
}
@Override
public void show() {
}
@Override
public void dispose() {
game.dispose();
}
@Override
public void hide() {
}
@Override
public void pause() {
}
@Override
public void resume() {
}
@Override
public void resize(int width, int height) {
}
}
答案 0 :(得分:1)
由于这个原因,我没有任何静态Screens
。 “重置”屏幕将引入错误,而不是可维护的代码。在许多情况下,只需创建一个新的“干净”屏幕就更容易了。
此处您还在描述效果。不是问题。是的,内存使用量增加。但这是一个问题吗?没有!为什么不?因为用户不会将应用程序发送到后台并连续1000次重新启动它。即使他这样做,内存使用也不会无休止地增长。它不断增长,因为添加的内存量太小,以至于JVM甚至都没有调用垃圾收集器。
在恢复应用程序的足够多次迭代之后,垃圾收集器最终会启动并清理所有未使用的屏幕。
通常,您不应该根据此行为立即更改您的体系结构。根据经验,您始终可以实例化新对象,例如切换屏幕或仅执行一次操作时。如果垃圾收集器在加载屏幕中启动,或者游戏刚刚启动,用户将不会受到打扰。您应该只关注在render()
方法中执行此操作,因为垃圾收集器可能会在实际游戏过程中清理并可能导致滞后。
答案 1 :(得分:0)
Stuntmania是正确的。在render()
方法中执行此操作时,创建新对象=增加了RAM使用量,尤其是。在游戏开发中,尤其是LibGDX,您应该始终质疑 new 关键字的用法。尽可能保持静止。
具体来说,你的主要游戏类应该做这样的事情:
public class MyEF extends Game {
public static TestScreen1 myScreen1;
public static TestScreen2 myScreen2;
@Override
public static void create() {
myScreen1 = new TestScreen1(this);
myScreen2 = new TestScreen2(this);
setScreen(myScreen1);
}
(...)
}
然后,在每个屏幕的render()
方法中,您只需拨打game.setScreen(myScreen2)
即可。这样,您就不再在每个渲染周期中创建新对象。