所以我有这个游戏循环:
public void run() {
long sleepTime;
while (state == RUNNING) {
long beforeTime = System.nanoTime();
//This is where we update the game engine
gameEngine.processGameTick();
Canvas c = null;
try {
c = surfaceHolder.lockCanvas(null);
synchronized (surfaceHolder) {
// This is where we draw the game state.
gameEngine.drawGameFrame(c);
}
} finally {
if (c != null) {
surfaceHolder.unlockCanvasAndPost(c);
}
}
sleepTime = FRAME_DELAY - ((System.nanoTime() - beforeTime)/1000000L);
try {
if(sleepTime > 0){
Thread.sleep(sleepTime);
}
} catch (InterruptedException ex) {}
}
}
当我尝试通过这样做安全地杀死它时:
boolean retry = true;
gameLoop.setLoopState(GameLoop.PAUSED);
while (retry) {
try {
gameLoop.join();
retry = false;
} catch (InterruptedException e) {}
}
它永远不会从gameLoop.join()
行返回(我用调试器检查过它)。
setLoopState方法非常简单,它只是更改了我的游戏循环的state
字段。
为什么会这样?
编辑:我在游戏循环的while循环的开头添加了System.out.println("State: " + state);
行,并且在执行join()方法后没有打印任何内容。
EDIT2:我知道这里有什么不对。你需要花费太多的地方和时间来发布我整个游戏的代码,但我会试着解释一下。游戏循环执行我的游戏引擎的processGameTick()
方法,然后检查某些内容以及何时发生(满足条件'某事'),游戏引擎在另一个对象中执行一个方法,然后调用stopEngine
方法执行上面发布的第二个代码清单(以boolean retry = true
开头的那个)。
这是否意味着一切都在一个线程上运行:特别是游戏循环线程,它最终会调用.join()?如果是这样,我该如何以其他方式解决?
如果你不理解我刚刚说的话,请告诉我。如果需要,我甚至可以用图片来解释这个。