Java 变量未在游戏循环中准确更新
我正在用Java创建一个游戏。我有一个每秒只运行60次的游戏循环,如下所示:Java 变量未在游戏循环中准确更新,java,loops,Java,Loops,我正在用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.nanoTi
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
在更新结束时,我将打印经过的总时间,除以变量,再除以100000000(转换为秒)
这应该打印
1
,因为变量每秒增加1,但是它打印0.8
,0.9
,0.95
,0.99
,0.999
,等等,接近1。为什么它不是正好一个?它不是正好一个,因为当差值为1时,CPU没有准确检查if条件
这意味着您不断增加增量,直到它大于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。不是每秒钟就发射一秒钟。错误源于您在print语句中计算表达式的方式。似乎有可能是整数除法或其他舍入问题将某些内容弄乱了,但您给出的代码并不清楚。什么类型是
开始
,增量
,上次
,以及现在
?您是否意识到整数除法和截断发生在设置timePerUpdate
的行上?将增量逻辑更改为delta=delta+1/60.0,看看会发生什么。这更多的是关于数学(极限计算)而不是编程。随着variable
的增加,我想结果会变为1。请用一个重现问题的变量更新您的问题。除了VeeArr指出的整数除法,实际上我们只是猜测。“我更新了我的代码”在做这件事之前,你读过@Radiodef链接的文档吗?MCVE不同于不可编译的代码段。因此,您的意思是变量更新正确,但打印值不正确的原因是因为调用打印函数的时间?我用一些代码进行了更新,以便您更好地理解。我还想提到,当除以fps速率时,每秒调用if语句60次。