Переменная не обновляется точно в цикле игры - PullRequest
0 голосов
/ 03 июля 2018

Я создаю игру на 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 Почему он не один?

1 Ответ

0 голосов
/ 03 июля 2018

Это не печатает точно один, потому что ЦП не точно проверяет условие 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 секунда. Ошибки возникают из-за того, как вы вычисляете выражение в операторе печати. ​​

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...