gpt4 book ai didi

java - (增量时间)在 Java 中每秒获取 60 个更新

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:45:46 24 4
gpt4 key购买 nike

这段代码我已经看过好几次了。

long lastTime = System.nanoTime();
final double ticks = 60D;
double ns = 1000000000 / ticks;
double delta = 0;

上面的代码获取系统时间并将其存储到lastTime。 60 个滴答应等于每秒更新的次数。

while(running){
long now = System.nanoTime();
delta += (now - lastTime) / ns;
lastTime = now;
if(delta >= 1){
tick();
delta--;
}

它采用now 并减去lastTime,然后将其转换为纳秒/60。是否可以保证 nowlastTime 之间的时间差超过 60 nano 会导致 delta 大于或等于 1,每秒 60 次?我不明白为什么 tick(); 每秒会运行大约 60 次。根据我的计算,每次循环运行 delta 都会增加 0.0025 左右。

最佳答案

它确保 tick() 方法每秒仅执行 60 次。它被称为 delta timing,并在整个游戏社区中被引用。使用增量计时的原因是让游戏在所有平台上以相同的速率运行。游戏中的物理和动画之类的东西需要以相同的速度运行,而不管系统的速度如何。如果您的系统较慢并且游戏不包含增量时间,则物理运行速度会比游戏在快速系统上运行时慢。

工作原理

  • 算出你想每秒更新多少次,在你的例子中是每秒 60 次。

  • 找到内置时间函数的语言分辨率。您的代码使用 Java 的内置 System.nanotime() 函数,该函数返回一个 long 值,表示系统已经运行了多少纳秒。

  • 一秒有 1000000000 纳秒,这意味着每次调用 tick() 的时间差等于 1000000000/60。这大约是 16666666 纳秒。这意味着无论何时调用 tick(),程序都会等待 16666666 纳秒,然后再次调用 tick()。

  • 您必须做的是找到当前帧和最后一帧之间的时间(以纳秒为单位)。该值除以时间步长 (16666666) 将为您提供已过去多少必要时间的小数百分比。如果将这个小数百分比添加到 delta 变量,当 delta 变量 >= 1 时,1/60 秒已经过去,这意味着程序现在可以调用 tick()。

  • 最后,您从 delta 变量中减去 1。您不将 delta 变量设置为 0 的原因是因为时间步长可能大于 1,并且 delta 变量将大于 1,这意味着您需要在下次循环调用时考虑到这一点tick()

关于java - (增量时间)在 Java 中每秒获取 60 个更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26838286/

24 4 0
文章推荐: java - 如何在 Java 中添加分数
文章推荐: java - 从应用引擎使用 Parse 发送推送通知
文章推荐: java - 垃圾收集器和 String.intern()
文章推荐: java - List 不为空,但不能在没有空指针异常的情况下调用 .isEmpty