Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 变量未在游戏循环中准确更新_Java_Loops - Fatal编程技术网

Java 变量未在游戏循环中准确更新

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

我正在用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

在更新结束时,我将打印经过的总时间,除以变量,再除以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次。