如何在java中每秒运行60次代码

62lalag4  于 2021-07-08  发布在  Java
关注(0)|答案(3)|浏览(565)

如果我不控制代码每秒执行的次数,当我添加一行时,程序会发生变化,我必须再次调整常量(我的代码失控了:

public builder(){
    while(true)
        stepEvent();
}
private void stepEvent() {
    setOfActions();
    repaint();
}
ztigrdn8

ztigrdn81#

import java.util.Timer;
import java.util.TimerTask;

public class HelloWorld {
    public static void main(String []args) {
        // number of ms in 1/60 of a second
        // there will be some rounding error here,
        // not sure if that's acceptable for your use case
        int ms = 1000 / 60;
        Timer timer = new Timer();
        timer.schedule(new SayHello(), 0, ms);
     }
}

class SayHello extends TimerTask {
    public void run() {
       System.out.println("Hello World!"); 
    }
}
rxztt3cl

rxztt3cl2#

要在定义的时间段内停止执行,可以使用 Thread.sleep(millis , nanos) ```
for(;;){
stepEvent();
Thread.sleep(100);
}

否则你可以用 `ScheduledExecutorService` 它允许您计划代码在指定的延迟之后或以固定的时间间隔运行一次。

ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
scheduledExecutorService.scheduleAtFixedRate(YourClass::stepEvent, 0, 100, TimeUnit.MILLISECONDS);

8ljdwjyq

8ljdwjyq3#

这只是一种方法(它非常长,但非常精确-我推荐它用于游戏开发)。在这种情况下,我使用 run() 方法来执行代码。

public void run(){
    long lastTime = System.nanoTime();
    final double ns = 1000000000.0 / 60.0;
    double delta = 0;
    while(true){
        long now = System.nanoTime();
        delta += (now - lastTime) / ns;
        lastTime = now;
        while(delta >= 1){
            the code you want to be executed 
            delta--;
            }
        } 
   }

逐行解释:
基本上,我将当前时间以纳秒为单位存储在 lastTime . 然后在 ns 我以纳秒为单位存储1/60秒并创建一个变量 delta .
在这之后,我进入无限while循环(它不必是无限的)并再次以纳秒为单位存储当前时间 now . 这要考虑到计算机从 lastTime 声明行到while循环行。
做完这一切之后,我又加了一句 delta 差异 now 以及 lastTime 除以1/60秒( ns )我提到过。这意味着每次 delta 等于1,1/60秒就会过去。
就在这之后,我 lastTime 与…相同 now . 在随后的while循环中,我检查delta是否等于或大于1,然后在其中,您应该将所有希望每秒执行60次的代码放入其中。别忘了从中减去1 delta 所以它不会无休止地循环。
仔细分析代码,看看你是否能理解它。如果你不能,我会进一步澄清。我坚持认为这只是一种可行的方法,但还有更多的方法。
注意:在某些情况下,您甚至不需要 delta ,但它对某些目的非常有用。
代码的功劳:大部分代码(至少是我从哪里得到的和学到的)都是从cherno的游戏编程系列中提取的
祝你有美好的一天!

相关问题