LibGDX 游戏暂停状态:动画 flicker/bug
LibGDX Game Pause State: Animation flicker/bug
我正在尝试为我的下一个游戏实现暂停选项。通过按下后退按钮,我的游戏应该进入 updatePause() 方法。但它会重复渲染最新的 2-3 帧。让它看起来像 "flickering".
为了避免这种情况,我添加了(在评论中)非连续渲染以防止闪烁。但是后来我面临的问题是多次按下后退按钮将渲染另一帧。 (其中一个闪烁的框架)。这是我的代码结构简而言之:
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;
}
}
}
有什么防止闪烁的技巧吗?
render()
方法应该在屏幕上绘制一些东西。如果没有,则后台缓冲区的内容将是未定义的(因此可能包含前一帧)并且您会看到此闪烁。
禁用连续渲染听起来是个好方法。或者,即使游戏暂停也继续绘制。
正如 Thomas 在他的回答中指出的那样。它应该每一帧都在绘制。
我还没有看到你在屏幕上绘制任何东西,所以后备缓冲区可能只包含垃圾信息。解决此问题的一种方法是始终清除 render()
顶部的屏幕。这意味着当您立即切换到另一个游戏状态时,它会确保屏幕清晰并且没有您所体验的闪烁结果。
public void render(float deltaTime) {
// clear screen
Gdx.gl.glClearColor(0f, 0f, 0f, 1.0f);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
...
}
正如 Thomas 所说:继续绘制是修复它的一种方法。所以我画了最新的帧,然后禁用了连续渲染。结果是完全没有错误,让 CPU 休息一下。
我正在尝试为我的下一个游戏实现暂停选项。通过按下后退按钮,我的游戏应该进入 updatePause() 方法。但它会重复渲染最新的 2-3 帧。让它看起来像 "flickering".
为了避免这种情况,我添加了(在评论中)非连续渲染以防止闪烁。但是后来我面临的问题是多次按下后退按钮将渲染另一帧。 (其中一个闪烁的框架)。这是我的代码结构简而言之:
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;
}
}
}
有什么防止闪烁的技巧吗?
render()
方法应该在屏幕上绘制一些东西。如果没有,则后台缓冲区的内容将是未定义的(因此可能包含前一帧)并且您会看到此闪烁。
禁用连续渲染听起来是个好方法。或者,即使游戏暂停也继续绘制。
正如 Thomas 在他的回答中指出的那样。它应该每一帧都在绘制。
我还没有看到你在屏幕上绘制任何东西,所以后备缓冲区可能只包含垃圾信息。解决此问题的一种方法是始终清除 render()
顶部的屏幕。这意味着当您立即切换到另一个游戏状态时,它会确保屏幕清晰并且没有您所体验的闪烁结果。
public void render(float deltaTime) {
// clear screen
Gdx.gl.glClearColor(0f, 0f, 0f, 1.0f);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
...
}
正如 Thomas 所说:继续绘制是修复它的一种方法。所以我画了最新的帧,然后禁用了连续渲染。结果是完全没有错误,让 CPU 休息一下。