我正在用Java创建游戏。我有一个游戏循环,每秒仅运行60次,如下所示:
public void run() {
double variable = 0;
init();
double delta, start, now, lastTime;
double fps = 60.0;
double timePerUpdate = 1000000000 / fps;
delta = 0;
lastTime = System.nanoTime();
start = lastTime;
while (running) {
now = System.nanoTime();
delta += (now - lastTime) / timePerUpdate;
lastTime = now;
if (delta >= 1) {
variable += delta / fps;
delta = 0;
System.out.println((now - start) / variable / 1000000000);
}
}
stop();
}
这是高度简化的,但它基本上显示了我在做什么。我有一个变量,我想每秒增加1,但每帧增加1/60左右,以便总每秒增加1。
在更新结束时,我将打印经过的总时间,除以变量,再除以1000000000(转换为秒)。
这应该打印1
,因为变量每秒增加1,但是,它正在打印0.8
,0.9
,0.95
,{{1} },0.99
等接近1。为什么不完全是一个?
答案 0 :(得分:0)
它打印的不是完全一幅,因为当差为1时,CPU不能精确地检查if条件。
意味着您不断增加增量,直到它大于1。一旦达到1,您将计算最后的增量,并计算变量,然后要求他打印差异。解释为什么它似乎达到1的原因可能是:随着时间差呈指数增长,计算的精度也会降低,并且趋向于1。因此达到1可能是计算值的舍入答案
查看此程序:
public static void main(String[] args) {
run();
}
public static void run() {
double variable = 0;
double delta, start, now, lastTime;
double fps = 60.0;
double conversionRate = 1000000000.0;
delta = 0;
lastTime = System.nanoTime();
start = lastTime;
int counter = 1;
while (true) {
now = System.nanoTime();
delta += (now - lastTime) / conversionRate;
lastTime = now;
// It fires every second or so
if (delta >= 1) {
delta = 0;
System.out.println("Counter is: " + counter++);
}
}
}
此程序每秒计数1。每秒不会精确地触发1秒。错误是由您在打印语句中计算表达式的方式引起的。