【问题标题】:Variable not Updating Accurately in Game Loop游戏循环中的变量未准确更新
【发布时间】: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.80.90.950.990.999等接近1 . 为什么不完全是一个?

【问题讨论】:

  • 似乎有整数除法或其他舍入问题在某处弄乱了一些东西,但从您给出的代码中不清楚。 startdeltalastTimenow 是哪些类型?您是否意识到在您设置timePerUpdate 的行上发生了整数除法和截断?
  • 将增量逻辑改为 delta = delta + 1/60.0 看看会发生什么。
  • 更多的是关于数学(极限计算)而不是编程。随着variable 的增加,我认为结果为 1。
  • 请使用minimal reproducible example 更新您的问题,以重现该问题。除了 VeeArr 指出的整数除法之外,我们只是在猜测。
  • “我更新了我的代码” 在这样做之前您是否阅读了@Radiodef 链接的文档? MCVE 与不可编译的代码 sn-p 不同。

标签: java loops


【解决方案1】:

它没有准确打印一个,因为当差值为 1 时,CPU 没有准确检查 if 条件。

意思是你不断地增加 delta 直到它大于 1。一旦它达到 1,你就取最后一个计算的 delta 并计算 变量,然后让他打印差异。为什么它似乎达到 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 秒。错误源于您在 print 语句中计算表达式的方式。

【讨论】:

  • 那么你是说变量被正确更新了,但是打印的值不正确的原因是因为调用了打印函数?
  • 我已经更新了一些代码,以便您更好地理解。我还想提一下,当您除以 fps 速率时,您每秒调用 if 语句 60 次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-09
  • 1970-01-01
  • 2016-09-05
  • 1970-01-01
  • 1970-01-01
  • 2014-01-21
相关资源
最近更新 更多