我注意到一些非常奇怪的东西(最终会使我的游戏崩溃)Thread.sleep()
,我无法弄清楚问题可能是什么。我连续两个小时运行以下方法,输出始终为100 + -5;
public void gameLoop() {
t0 = time();
while (GameState.getInstance().getState() == GameCondition.RUNNING) {
engine.update();
sfx.play();
t1 = time();
delta = t1 - t0;
gfx.render((int) delta);
t0 = time();
System.out.println(delta);
sleep(100);
}
}
现在,如果我运行完全相同的方法,而不是为常数100睡觉而不是delta
public void gameLoop() {
t0 = time();
while (GameState.getInstance().getState() == GameCondition.RUNNING) {
engine.update();
sfx.play();
t1 = time();
delta = t1 - t0;
gfx.render((int) delta);
t0 = time();
System.out.println(delta);
sleep(delta);
}
}
现在输出显示:
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
2
....
After a minute
571
我不知道我是否太累了,犯了一个明显的错误,或者发生了一些非常奇怪的事情,这就是睡眠。
private void sleep(long milliSeconds) {
System.out.println();
try {
Thread.sleep(milliSeconds);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
编辑:问题? delta是“泄漏”,因为内部方法(在睡眠之前)几乎没有时间使用(如sleep(100)
测试所证明的那样)我期望delta非常精确,具有轻微到无波动,但它仍在不断增长。
答案 0 :(得分:6)
在循环中,delta计算包含先前睡眠的时间,然后为此新的delta时间休眠。如果睡眠(或你的代码)一直很慢(比如1ms,这可能发生),那么下次你的delta将会延长1ms,所以你会睡2ms。
你的下一次迭代,因为你上次睡了2ms,将至少2ms。如果睡眠或你的代码再次变慢(会发生),那么下次你将睡3ms,依此类推。您正在积累由于您的delta而可能发生的所有缓慢,包括之前的睡眠时间及其中的任何错误。