【问题标题】:Have I implemented deltatime correctly?我是否正确实施了 deltatime?
【发布时间】:2021-09-25 04:51:08
【问题描述】:

我正在用 Java 制作游戏,并希望实现一个 deltatime 系统。但是我不确定我是否正确实施了它。我做的方式是否正确,或者我应该改变它。

我的代码如下所示:

long oldtime = System.nanoTime();

while (true) {
    long newtime = System.nanoTime();
    long deltatime = (newtime - oldtime) / 1000000;
    System.out.println(deltatime);
    oldtime = newtime;

    // render code

    try {
        Thread.sleep(Math.max(0, 32 - deltatime));
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

【问题讨论】:

  • 我们自己的测试结果符合您的期望吗?
  • 我认为增量时间的一个重要部分是您在// render code 中实际执行的操作(即您如何考虑实际经过的时间量)。你没有向我们展示那部分。
  • 您是否尝试过使用 LigGdx 来创建您的游戏。 ?

标签: java time


【解决方案1】:

您似乎想测量渲染所用的时间。因此,我建议采用更简洁的方法,将开始时间存储在变量 (start) 中,然后在渲染发生后计算与当前时间的差异。这将允许您通过添加另一个与当前时间之间的比较来轻松测量子步骤。

始终注意单位(ms、µs、ms),并通过相应地命名变量(例如deltaMs)或使用注释使其明显。通过声明 final 来保护引用也是一个好主意。

这是一个简单的例子:

while (true) {
    final long start = System.nanoTime(); // initial reference

    // simulate render code
    try { Thread.sleep(32); } catch (InterruptedException e) { e.printStackTrace(); }

    final long deltaMs = (System.nanoTime() - start) / 1_000_000;
    System.out.println("Render took " + deltaMs + "ms");
}

这是一个嵌套示例:

while (true) {
    final long start = System.nanoTime();
    /* A */ try { Thread.sleep(20); } catch (InterruptedException e) { e.printStackTrace(); }

    final long deltaMsPartA = (System.nanoTime() - start) / 1_000_000;
    System.out.println("Render part A took " + deltaMsPartA + "ms");

    final long startPartB = System.nanoTime();
    /* B */ try { Thread.sleep(30); } catch (InterruptedException e) { e.printStackTrace(); }

    final long deltaMsPartB = (System.nanoTime() - startPartB) / 1_000_000;
    System.out.println("Render part B took " + deltaMsPartB + "ms");

    final long deltaMs = (System.nanoTime() - start) / 1_000_000;
    System.out.println("Overall render took " + deltaMs + "ms");
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-02
    • 2019-06-30
    • 2011-03-27
    相关资源
    最近更新 更多