2012-06-06 3 views
5

Я разрабатываю приложение с использованием Processing.js.Processing.js таймер

На каждом шаге цикла рисования я увеличиваю количество кадров на один frame++.

Я хочу знать, сколько времени прошло. В настоящее время, чтобы получить время (зная, что мое приложение настроено на работу на 60FPS), мне так нравится: time=frame/60. Но это работает только в том случае, если приложение всегда работает именно с FPS, и все мы знаем, что это не так, потому что это зависит от оборудования пользователя.

Я хочу, чтобы таймер был довольно точным (только с ошибкой 0.0001s).

Предлагая некоторый алгоритм javascript для вычисления разницы между now() и start_time(), также приветствуется.

ответ

2

Вы можете сохранить время начала с переменной.

Затем создайте новый таймер, когда вы хотите и вычитать переменное время начала из него .. Результата будет разницей в миллисекундах ..

Вы можете также использовать фактическое время, деленное на рамах счетчика для получить точную среднюю частоту кадров вашего приложения ..

что-то вроде

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

и всякий раз, когда вы хотите проверить

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

Demo в http://jsfiddle.net/gaby/CF4Ju/

3

Если вы хотите точность, посмотрите в high resolution timers. Однако эта функция недоступна для всех браузеров.

Кроме того, у Process.js есть встроенная переменная с постоянным содержимым с именем frameCount. Вы можете запросить это, а не считать сами кадры.

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; 
    } 
} 

Если объект таймера создается с помощью параметра, то предполагается, что таймер должен уменьшаться. В противном случае условие выхода можно проверить, получив значение от getSeconds().

Смежные вопросы