代码之家  ›  专栏  ›  技术社区  ›  Anish Shanbhag

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

  •  0
  • Anish Shanbhag  · 技术社区  · 7 年前

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

    这应该打印出来 1 因为变量每秒增加1,但实际上是在打印 0.8 , 0.9 , 0.95 , 0.99 , 0.999 ,等等。接近1。为什么不是一个呢?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Harry    7 年前

    它不是精确打印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。并非每一秒都能开火 1秒。错误源于您在print语句中计算表达式的方式。