Java 每x毫秒更新一个对象

Java 每x毫秒更新一个对象,java,Java,我有个问题。要制作视频游戏,我必须实现一个名为update()的函数 参数lastCallTime是我们最后一次调用update 它必须做到以下几点: 计算自上次调用更新以来经过的时间 如果经过的时间比ifUpdate=true多20[ms] 并重置每个对象的上次更新时间 线程将以以下方式调用此方法: @Override public void run(){ long lastCallTime; int k = 0; lastCallTime = System.curr

我有个问题。要制作视频游戏,我必须实现一个名为update()的函数

参数lastCallTime是我们最后一次调用update

它必须做到以下几点:

  • 计算自上次调用更新以来经过的时间

  • 如果经过的时间比ifUpdate=true多20[ms]

  • 并重置每个对象的上次更新时间

  • 线程将以以下方式调用此方法:

    @Override
    public void run(){
        long lastCallTime;
        int k = 0;
    
        lastCallTime = System.currentTimeMillis();
        while(true){
            //Do something
            boolean ifUpdate = update(lastCallTime);          
        }
    }
    

    不久前,我写了一些类似的东西。 update方法将以FPS速率调用(示例中为24)。因此,需要计算更新方法所消耗的时间(变量
    timeDiff
    )。还将检查进程睡眠时间是否大于或小于所指示的时间(变量
    overSleepTime
    ),此时间将在下一个周期中被加/减

    我希望它能帮助你

    long timeDiff, sleepTime;
    long afterTime, beforeTime;
    long overSleepTime = 0L;
    
    int fps = 24; // the desire FPS
    long period = 1000000000L / fps;
    
    while(true) {
      beforeTime = System.nanoTime();
    
      // your game logic
      update();
    
      afterTime = System.nanoTime();
    
      // timeDiff is time needed by the update process
      timeDiff = afterTime - beforeTime;
      sleepTime = (period - timeDiff) - overSleepTime;
    
      if(sleepTime > 0) {
        try {
          Thread.sleep(sleepTime / 1000000L); // sleeptTime is in nano secs and sleep expects millis
        } catch(InterruptedException e) {}
    
        // checks if the thread has slept more than desired
        overSleepTime = (System.nanoTime() - afterTime) - sleepTime;
    
      } else {
        // negative sleeptTime means that the system can't be update at the desired rate
        overSleepTime = 0L;
      }
    }
    

    }
    lastUpdated=System.currentTimeMillis()
    instrad of
    =0
    @darijan:事实上,我想你应该希望
    lastUpdated=currentTime
    。你应该看看观察者的模式我不明白为什么lastUpdated=0;因为你想让它在最后一次更新1)这是秋千吗?2) 为了更快地获得更好的帮助,请发布一个。3) 不要阻止EDT(事件调度线程)-发生这种情况时,GUI将“冻结”。不要调用
    Thread.sleep(n)
    为重复任务执行Swing
    计时器,或为长时间运行的任务执行
    SwingWorker
    。有关更多详细信息,请参阅。4) 你的问题是什么?
    long timeDiff, sleepTime;
    long afterTime, beforeTime;
    long overSleepTime = 0L;
    
    int fps = 24; // the desire FPS
    long period = 1000000000L / fps;
    
    while(true) {
      beforeTime = System.nanoTime();
    
      // your game logic
      update();
    
      afterTime = System.nanoTime();
    
      // timeDiff is time needed by the update process
      timeDiff = afterTime - beforeTime;
      sleepTime = (period - timeDiff) - overSleepTime;
    
      if(sleepTime > 0) {
        try {
          Thread.sleep(sleepTime / 1000000L); // sleeptTime is in nano secs and sleep expects millis
        } catch(InterruptedException e) {}
    
        // checks if the thread has slept more than desired
        overSleepTime = (System.nanoTime() - afterTime) - sleepTime;
    
      } else {
        // negative sleeptTime means that the system can't be update at the desired rate
        overSleepTime = 0L;
      }
    }