我一直在研究一个简单的游戏引擎。一切都很顺利,我完成了基础。我的意思是,游戏设置了用户定义的显示设置,初始化内容,然后开始游戏循环。一切都很好,除了我在窗口模式和全屏模式下都有问题:
在窗口模式下,有时屏幕会显示为空白,直到我调整或最小化窗口。
在全屏模式下,如果我使用默认的显示分辨率,我只会得到一个空白屏幕。大多数其他分辨率看起来都很好。
这是一些与显示屏幕相关的代码:
这在用户按下显示设置对话框上的播放按钮时执行
public void actionPerformed(ActionEvent e) {
DisplayMode dm = modes[resolutionBox.getSelectedIndex()];
boolean fs = fullscreenBox.getSelectedItem().equals ("Fullscreen");
boolean vs = vSyncCheckBox.isSelected();
game.initScreen (dm, fs, vs);
runGame (game);
f.dispose();
}
});
private final void runGame(EGame g)
{
Thread t = new Thread (g);
t.start();
}
这是EGame类中的run方法
public final void run() {
start();
isRunning = true;
gameLoop();
endGame();
}
引擎的用户会在 start() 方法中调用 setGameCanvas() 方法。其他东西可以在 start() 方法中进行,但对于我的测试游戏,它只是那个方法:
protected final void setGameCanvas(EGameCanvas c)
{
screen.remove (canvas);
canvas = c;
canvas.addKeyListener (keyboard);
screen.add (canvas);
}
最后,这是游戏循环:
private final void gameLoop()
{
// Final setup before starting game
canvas.setBuffer (2);
screen.addKeyListener (keyboard);
canvas.addKeyListener (keyboard);
int TARGET_FPS = screen.getTargetFps();
final long OPTIMAL_TIME = 1000000000 / TARGET_FPS;
long lastLoopTime = System.nanoTime();
long now = 0;
long lastFpsTime = 0;
long updateLength = 0;
double delta = 0;
int fps = 0;
while (isRunning)
{
now = System.nanoTime();
updateLength = now - lastLoopTime;
lastLoopTime = now;
delta = updateLength / ((double) OPTIMAL_TIME);
lastFpsTime += updateLength;
fps++;
if (lastFpsTime >= 1000000000)
{
screen.setFps (fps);
lastFpsTime = 0;
fps = 0;
}
keyboard.poll();
keyboardEvents();
update (delta);
render();
try {
Thread.sleep( (lastLoopTime-System.nanoTime() + OPTIMAL_TIME)/1000000 );
}
catch (Exception ex) {}
}
}
现在,请记住,我的问题都不存在,直到我添加了 run 方法并在单独的线程中运行它。我可以保证这是一个线程问题。
但是,我不是专家,所以任何建议将不胜感激。