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()
中视口更新之后。