处理:应该同步的数字不同步

Processing: numbers that should be in sync aren't

这是我的问题。我正在制作一个程序,以秒或分钟为单位倒计时到下一年(分钟到小数点后 1 位,秒到 none),但我遇到了倒计时与系统有点不同步的问题时间。这不是太多,只有半秒左右,但就个人而言,这让我很烦恼。我只是在查看计算机上的时钟时注意到了这一点,并且可以肯定的是,我添加了一个 System.out.println() 调用来输出倒计时数字和实际时间。这是我的代码:

import java.util.Calendar;
import java.util.GregorianCalendar;

Calendar currentTime;
Calendar newYear;
int nextYear;
boolean isFullScreen = false;
boolean minutes = false;

void settings() {
  if(isFullScreen) {
    fullScreen();
  } else {
    size(500, 250);
  }
}
void setup() {
  frameRate(60);
}
void draw() {
  background(255, 0, 0);
  currentTime = Calendar.getInstance();
  nextYear = currentTime.get(Calendar.YEAR) + 1;
  newYear = new GregorianCalendar(nextYear, 1, 1, 0, 0, 0);
  textAlign(CENTER, CENTER);
  fill(0);
  if(isFullScreen) {
    textSize(200);
  } else {
    textSize(50);
  }
  long timeInMillis = currentTime.getTimeInMillis();
  long newYearInMillis = newYear.getTimeInMillis();
  if(minutes) {
    text(String.valueOf((float)ceil((float)(newYearInMillis - timeInMillis)/6000)/10), width/2, height/2);
  } else {
    System.out.println(String.valueOf(ceil((float)(newYearInMillis - timeInMillis)/1000)) + ", " + currentTime.get(Calendar.SECOND));
    text(String.valueOf(ceil((float)(newYearInMillis - timeInMillis)/1000)), width/2, height/2);
  }
}
void mouseClicked() {
  minutes = !minutes;
}

我得到了一个没有意义的输出:

5666570, 10
5666570, 10
5666570, 10
5666570, 10
5666570, 10
5666570, 10
5666570, 10
5666570, 10
5666570, 10
5666570, 10
5666569, 10
5666569, 10
5666569, 10
5666569, 10
5666569, 10
5666569, 10
5666569, 10
5666569, 10
5666569, 10
5666569, 10
5666569, 10
5666569, 10
5666569, 10
5666569, 10
5666569, 10
5666569, 10
5666569, 10
5666569, 10
5666569, 10
5666569, 10
5666569, 10
5666569, 10
5666569, 10
5666569, 10
5666569, 10
5666569, 10
5666569, 10
5666569, 10
5666569, 11
5666569, 11
5666569, 11
5666569, 11
5666569, 11
5666569, 11
5666569, 11
5666569, 11
5666569, 11
5666569, 11
5666569, 11
5666569, 11
5666569, 11
5666569, 11
5666569, 11
5666569, 11
5666569, 11
5666569, 11
5666569, 11
5666569, 11
5666569, 11
5666569, 11
5666569, 11
5666569, 11
5666569, 11

注意倒计时如何认为它应该在实际时间之前倒计时 28 帧。虽然这不是很大,但它不仅足以引起注意,而且足以让人发疯,试图找出问题所在。

首先,不要依赖 System.out.println() 进行计时。它比其他输出慢得多,因此打印语句滞后于屏幕显示时间是正常的。

话虽这么说,该程序正按照您的指示进行操作 - 它将时间 up 舍入到下一秒。这就是为什么您的屏幕时间看起来比实际时间提前半秒。

只需停止使用 ceil() 功能,您的时间就会与系统时间非常接近地同步:

text(String.valueOf((newYearInMillis - timeInMillis)/1000), width/2, height/2);

此外,我不确定您的所有逻辑是否正确。例如,GregorianCalendar 个月是从零开始的,所以一月应该是 0,而不是 1。