5

我正在使用 Processing.js 开发一个应用程序。

在绘图循环的每一步,我都会将帧数增加一frame++

我想知道已经过去了多少时间。目前为了让时间过去(知道我的应用程序设置为在 60FPS 上运行),我确实喜欢这样:time=frame/60. 但这仅适用于应用程序始终以精确的 FPS 运行并且我们都知道情况并非如此,因为它取决于用户的硬件。

我希望计时器非常准确(只有 0.0001 秒的错误)。

也欢迎提出一些用于计算 now() 和 start_time() 之间差异的 javascript 算法。

4

3 回答 3

3

如果您想要准确性,请查看高分辨率计时器。但是,此功能并非在所有浏览器上都可用。

此外,Processing.js 有一个名为 frameCount 的内置只读变量。您可以查询它而不是自己计算帧数。

于 2012-06-06T12:48:49.830 回答
2

您可以将开始时间存储在变量中。

然后随时创建一个新计时器并从中减去开始时间变量。结果将以毫秒为单位。

您还可以使用实际时间除以帧计数器来获得应用程序的准确平均帧速率。

就像是

var startTimer = new Date(); // at start (once)

每当你想检查

var passed = new Date() - startTimer; // in milliseconds

演示在http://jsfiddle.net/gaby/CF4Ju/

于 2012-06-06T11:58:06.977 回答
0

我为一个游戏编了这门课。它使用millis()并且独立于frameRate

class Timer{
  boolean increment, inProgress;
  int spawn, end;
  int seconds, tm_limit;

  Timer(int tm_limit){
    this.tm_limit = tm_limit;
    seconds = tm_limit;
    increment = false;
    inProgress = false;
  }

  Timer(){
    seconds = 0;
    increment = true;
    inProgress = false;
  }

  void start(){
    inProgress = true;
    spawn = millis();
  }

  void stop(){
    inProgress = false;
    end = millis();
  }

  int getSeconds(){
    if(inProgress){
      if(increment){
        seconds = int((millis() - spawn) / 1000);
      }
      else{
        if(seconds - int((millis() - spawn) / 1000) != seconds){
          seconds = seconds - int((millis() - spawn) / 1000);
          if(seconds <= 0) { stop(); }
          else spawn = millis();
        }
      }
    }
    return seconds;
  }

  void reset(){
    if(!increment)
      seconds = tm_limit;
    else
      seconds = 0;

    inProgress = false;
  }
}

如果使用参数实例化 Timer 对象,则假定 Timer 应该减少。getSeconds()否则,可以通过从方法中获取值来检查退出条件。

于 2013-10-10T17:33:38.300 回答