我正在尝试为以下游戏实施暂停选项。通过按后退按钮我的游戏应该转到updatePause()方法。但它反复渲染最新的2-3帧。让它看起来像是闪烁的"。
试图阻止这种情况,我已经添加(在评论中)非连续渲染,这防止了闪烁。但后来我面临的问题是不止一次按下后退按钮会渲染另一帧。 (其中一个闪烁的帧)。这是我的代码结构:
public class GameScreen implements Screen {
private static final int GAME_RUNNING = 0;
private static final int GAME_PAUSED = 1;
private static final int GAME_OVER = 2;
private static final int GAME_LEVEL_END = 3;
private int gameState;
private GdxGame game;
//create()
public GameScreen(final GdxGame game) {
//create all the stuff
}
@Override
public void render(float deltaTime) {
switch (gameState) {
case GAME_RUNNING:
updateRunning(deltaTime);
break;
case GAME_PAUSED:
updatePause(deltaTime);
break;
case GAME_OVER:
updateGameOver();
break;
}
}
public void updateRunning(float deltaTime) {
//draw section
if (gameState == GAME_RUNNING) {
game.batch.begin();
//Draw some stuff
game.batch.end();
//move section
handleInput();
}
}
public void updatePause(float deltaTime) {
//Gdx.graphics.setContinuousRendering(false);
//resume
if (Gdx.input.isTouched()) {
gameState = GAME_RUNNING;
//Gdx.graphics.setContinuousRendering(true);
return;
}
}
private void handleInput() {
//catch back button
Gdx.input.setCatchBackKey(true);
if (Gdx.input.isKeyJustPressed(Input.Keys.BACK)) {
gameState = GAME_PAUSED;
return;
}
}
}
任何防止闪烁的提示?
答案 0 :(得分:3)
render()
方法应该在屏幕上绘制内容。如果没有,那么后台缓冲区的内容将是未定义的(因此可能包含前一帧)并且你得到这个闪烁。
禁用连续渲染听起来像是一种很好的方法。或者,即使游戏暂停,也要继续绘图。
答案 1 :(得分:1)
正如托马斯在答案中指出的那样。它应该绘制每一帧。
我还没有看到你在屏幕上画任何东西,所以backbuffer可能只包含垃圾信息。解决此问题的一种方法是始终清除render()
顶部的屏幕。这意味着当您立即切换到另一个游戏状态时,它将确保屏幕清晰,并且没有您所经历的闪烁结果。
public void render(float deltaTime) {
// clear screen
Gdx.gl.glClearColor(0f, 0f, 0f, 1.0f);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
...
}
答案 2 :(得分:0)
屏幕上的所有对象或只有使用动画的对象是否会发生噼啪声?
答案 3 :(得分:0)
正如托马斯所说:继续绘画是解决问题的一种方法。所以我绘制了最新的帧并禁用了连续渲染。结果是没有任何错误并让CPU休息。