Java 为什么LWJGL仅在Windows上的上一个和当前游戏状态之间闪烁?
此问题仅在Windows中发生。在Linux中运行良好 我有一个基于堆栈的状态管理系统。当我从一种状态切换到另一种状态时,显示屏将在前一种状态和当前状态之间闪烁。它几乎就像一个缓冲器仍然显示以前的状态,并与当前状态交替 这是我的第一个状态初始化、绘制和退出代码:Java 为什么LWJGL仅在Windows上的上一个和当前游戏状态之间闪烁?,java,opengl,lwjgl,opengl-1.x,Java,Opengl,Lwjgl,Opengl 1.x,此问题仅在Windows中发生。在Linux中运行良好 我有一个基于堆栈的状态管理系统。当我从一种状态切换到另一种状态时,显示屏将在前一种状态和当前状态之间闪烁。它几乎就像一个缓冲器仍然显示以前的状态,并与当前状态交替 这是我的第一个状态初始化、绘制和退出代码: init在第一次加载状态时被调用 draw称为每个循环 pause在将新状态置于堆栈顶部之前被调用 private void init() { glEnable(GL_TEXTURE_2D); glSh
在第一次加载状态时被调用init
称为每个循环draw
在将新状态置于堆栈顶部之前被调用pause
下面是下一个游戏状态代码:private void init() { glEnable(GL_TEXTURE_2D); glShadeModel(GL_SMOOTH); glDisable(GL_DEPTH_TEST); glDisable(GL_LIGHTING); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClearDepth(1); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glViewport(0,0,Game.getGameConfig().getDisplayWidth(),Game.getGameConfig().getDisplayHeight()); glMatrixMode(GL_MODELVIEW); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0,Game.getGameConfig().getDisplayWidth(), Game.getGameConfig().getDisplayHeight(), 0, 1, -1); glMatrixMode(GL_MODELVIEW); } public void draw() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); titleFont.drawString((Game.getGameConfig().getDisplayWidth()/2)-(titleFont.getWidth(titleText)/2), (Game.getGameConfig().getDisplayHeight()/2) - (titleFont.getHeight()/2) , titleText,Color.orange); if(showStartText) { pressStartFont.drawString((Game.getGameConfig().getDisplayWidth()/2)-(pressStartFont.getWidth(pressStartText)/2), (Game.getGameConfig().getDisplayHeight()/2) - (titleFont.getHeight() - 100), pressStartText, Color.orange); } } public void pause() { glDisable(GL_BLEND); glDisable(GL_TEXTURE_2D); }
private void init() { glEnable(GL_TEXTURE_2D); glShadeModel(GL_SMOOTH); glDisable(GL_DEPTH_TEST); glDisable(GL_LIGHTING); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClearDepth(1); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glViewport(0,0,Game.getGameConfig().getDisplayWidth(),Game.getGameConfig().getDisplayHeight ()); glMatrixMode(GL_MODELVIEW); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0,Game.getGameConfig().getDisplayWidth(), Game.getGameConfig().getDisplayHeight(), 0, 1, -1); glMatrixMode(GL_MODELVIEW); } public void draw() { GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); mainMenu.draw(); Display.update(); } public void pause() { glDisable(GL_BLEND); glDisable(GL_TEXTURE_2D); }
super.sm.push(新主菜单(super.sm))代码>
以下是StateManager(sm
)代码:
主游戏循环正在StateManager上调用此方法:
public void draw()
{
if(!states.empty())
{
states.peek().draw();
}
Display.update();
}
是什么导致Windows上出现状态之间的闪烁?您有一个Display.update()在StateManager绘图方法和gameState绘图方法中都使用code>。删除处于游戏状态的缓冲区。我怀疑在交换状态时可能需要清除缓冲区。有没有办法做到这一点?也许在你第一次切换状态后,每一帧都会调用两个绘图函数?我不这么认为。状态管理器非常可靠,我不认为这可以解释为什么它在Linux上工作得很好。我的想法是,在Windows上,它同时调用这两个函数,但只是随机顺序。无论如何,我认为这里没有足够的信息来调试您的问题。我添加了一些在切换期间调用的statemanager代码。
public void draw()
{
if(!states.empty())
{
states.peek().draw();
}
Display.update();
}