我是否正确实施了增量时间?
Have I implemented deltatime correctly?
我正在 Java 制作游戏,并希望实现增量时间系统。但是我不确定我是否正确实施了它。我的做法是对的还是应该改一下
我的代码如下所示:
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();
}
}
您似乎想测量渲染花费的时间。因此,我建议通过将开始时间存储在变量 (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");
}
我正在 Java 制作游戏,并希望实现增量时间系统。但是我不确定我是否正确实施了它。我的做法是对的还是应该改一下
我的代码如下所示:
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();
}
}
您似乎想测量渲染花费的时间。因此,我建议通过将开始时间存储在变量 (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");
}