【发布时间】:2018-07-03 07:04:47
【问题描述】:
我正在用 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、0.99、0.999等接近1 . 为什么不完全是一个?
【问题讨论】:
-
似乎有整数除法或其他舍入问题在某处弄乱了一些东西,但从您给出的代码中不清楚。
start、delta、lastTime和now是哪些类型?您是否意识到在您设置timePerUpdate的行上发生了整数除法和截断? -
将增量逻辑改为 delta = delta + 1/60.0 看看会发生什么。
-
更多的是关于数学(极限计算)而不是编程。随着
variable的增加,我认为结果为 1。 -
请使用minimal reproducible example 更新您的问题,以重现该问题。除了 VeeArr 指出的整数除法之外,我们只是在猜测。
-
“我更新了我的代码” 在这样做之前您是否阅读了@Radiodef 链接的文档? MCVE 与不可编译的代码 sn-p 不同。