Java Libgdx减少呼叫并优化游戏

Java Libgdx减少呼叫并优化游戏,java,android,libgdx,Java,Android,Libgdx,我试图减少每次在游戏中调用屏幕时的呼叫次数,以加快游戏速度,我注意到我在每个屏幕上都做了很多相同的计算。我如何避免这种情况 我几乎在每个屏幕上都这样做 public class ****Screen implements Screen { @Override public void show() { float screenWidth = Gdx.graphics.getWidth(); float screenHeight = Gdx.graphics.get

我试图减少每次在游戏中调用屏幕时的呼叫次数,以加快游戏速度,我注意到我在每个屏幕上都做了很多相同的计算。我如何避免这种情况

我几乎在每个屏幕上都这样做

public class ****Screen implements Screen {
    @Override
    public void show() {

    float screenWidth = Gdx.graphics.getWidth();
    float screenHeight = Gdx.graphics.getHeight();
    float gameWidth = 360;
    float gameHeight = screenHeight / (screenWidth / gameWidth);
    midPointY = (int) (gameHeight / 2);
    cam = new OrthographicCamera();
    cam.setToOrtho(true, gameWidth, gameHeight);
    viewport = new FitViewport(gameWidth, gameHeight, cam);
    viewport.apply();
    stage = new Stage(viewport);
    Gdx.input.setInputProcessor(stage);
但是我有一个GameClass..如何在我的GameClass(下面)中实现上述功能,并且只需调用一次

public class Start extends Game {
     @Override
    public void create() {
    float screenWidth = Gdx.graphics.getWidth();
    float screenHeight = Gdx.graphics.getHeight();
    float gameWidth = 360;
    float gameHeight = screenHeight / (screenWidth / gameWidth);

    assets = new AssetLoader();
    assetManager = new AssetManager();
    camera = new OrthographicCamera();
    camera.setToOrtho(true, gameWidth, gameHeight);

    //initialize screens here
    mainMenu = new MenuScreen(this);
    loadingScreen = new LoadingScreen(this);
    gameScreen = new GameScreen(this);

    .......

    //call assets
    AssetLoader.load();

    //start mainmenu...
    this.setScreen(mainMenu);
}

首先,我必须告诉你,这实际上不会加快你的比赛速度。 若你们每20秒更换一次屏幕,那个么这意味着游戏每1200帧计算1帧。 然而,我和你们一样,在做游戏的时候真的在寻找最优化的方法

我找到了这个案子的解决办法。 您可以将在所有屏幕中使用的对象从游戏类传递到屏幕类

屏幕类

public class MainMenuScreen implements Screen {

    public MainMenuScreen(OrthographicCamera camera) {
        this.camera=camera;
    }

//...Rest of class omitted for succinctness.
}
游戏课

public class Starts extends Game {

 OrthographicCamera camera;
    public void create() {
        camera=new OrthographicCamera();
        camera.setToOrtho(false, 800, 480);
        this.setScreen(new MainMenuScreen(camera));// change screen and pass camera to new screen.
    }

}
或者你甚至可以像这样通过整个游戏课程

public class MainMenuScreen implements Screen {

final Starts game;
public MainMenuScreen(final Starts game) {
    this.game = game;

}

@Override
public void render(float delta) {
    Gdx.gl.glClearColor(0, 0, 0.2f, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

    game.camera.update();
    game.batch.setProjectionMatrix(game.camera.combined);

    game.batch.begin();
    game.font.draw(...);
    game.font.draw(...);
    game.batch.end();

    if (Gdx.input.isTouched()) {
        game.setScreen(new AnotherScreen(game));
        dispose();
    }
}

}
只需要在游戏课上这样打电话。所以你可以在所有的屏幕上使用游戏的字体等

this.setScreen(new MainMenuScreen(this));

我猜你的意思是想缩短切换屏幕时出现的小问题。(游戏的帧速率不受此影响。)

简单方法:将代码从
show
移动到每个屏幕类的构造函数

但是,为每个屏幕创建一个新阶段而不向其传递SpriteBatch是浪费的,因为您实际上是在实例化三个单独的SpriteBatch,它们是重对象(它们有一个用于网格数据的大数组,GPU上有一个大网格,并且必须编译着色器)

您可以在游戏类中实例化共享对象,并将其传递到屏幕的构造函数中,如下所示:

public class Start extends Game {
    SpriteBatch spriteBatch;

     @Override
    public void create() {
        //...

        //initialize screens here

        spriteBatch = new SpriteBatch(); //must be disposed in dispose()

        mainMenu = new MenuScreen(this, spriteBatch);
        loadingScreen = new LoadingScreen(this, spriteBatch);
        gameScreen = new GameScreen(this, spriteBatch);

        //...
    }
}
相应地更新屏幕的构造器,并将sprite批传递给stage构造器。视口和摄影机都是轻量级的,所以我不想麻烦将它们移动到游戏类中,除非它有助于提高代码的可维护性


顺便说一下,通过预先计算纵横比,您有点滥用了FitViewport。视口的要点是,设置时不需要计算任何内容。使用
new ExtendViewport(360,1,cam)
获得与不进行计算相同的操作。请确保在
resize()

中更新它,谢谢..原来我一直在调用整个游戏类,甚至从未想过实现屏幕宽度和屏幕高度,因此将我的游戏高度设置为1没有帮助事实上,整个游戏的高度都变为1…我缺少了什么吗?ExtendViewport,不合适。另外,请确保在“调整大小”中对其进行更新。很抱歉..现在效果很好..在我的应用程序中,我是否用1替换所有gameHeight实例?例如,在labels、images、button.setPosition().e.t.cNo下,可以调用
gameHeight=camera.getViewportHeight()
resize()
中视口更新之后。