【问题标题】:Processing.js timerProcessing.js 计时器
【发布时间】:2012-06-06 10:54:24
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: javascript timer processing.js


    【解决方案1】:

    如果您想要准确,请查看high resolution timers。但是,此功能并非在所有浏览器上都可用。

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

    【讨论】:

      【解决方案2】:

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

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

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

      类似

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

      以及当你想检查时

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

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

      【讨论】:

        【解决方案3】:

        我为一个游戏编了这门课。它使用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() 方法获取值来检查退出条件。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-04
          相关资源
          最近更新 更多