Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Does JavaScript provide a high resolution timer?

Does JavaScript provide a high resolution timer?

I've written a few game engines from scratch, some in C, some in Java, and some in Flash. I always follow the same basic model when it comes to animations and interactive graphics. Create a basic class/structure with the following design:

void init() { /* Called once, preload essential resources here. */ } void update(double time) { /* Updates game/animation state using high resolution time. */ } void render(double time) { /* Updates screen graphics using high resolution time. */ }  void run() {     double time;     init();     while (!done)     {         time = queryTime();         update(time);         render(time);     } } 

Time is so important to smooth animations and game state calculations. In native code Windows, I use QueryPerformanceCounter() and QueryPerformanceFrequency() to perform the role of queryTime() in each game loop and pass the time to update/render. In Java, I use System.nanoTime().

What's the equivalent in JavaScript? That is, some function like queryTime() which returns a time value with a high degree of accuracy (sub millisecond). From what I've heard the best accuracy you can get in JavaScript is about 15 ms ... which is horrible for animation.

like image 598
sysrpl Avatar asked Jul 29 '11 15:07

sysrpl


People also ask

What is performance in JavaScript?

In JavaScript performance. now() method can be used to check the performance of your code. You can check the execution time of your code using this method. It returns the value of time (of type double) in milliseconds. The returned value represents the time elapsed since the execution started.

What Does performance now() return?

The performance. now() method returns a DOMHighResTimeStamp , measured in milliseconds. The returned value represents the time elapsed since the time origin.

Is performance now faster than date now?

No! Date. now() returns the number of milliseconds elapsed since 1 January 1970 00:00:00 UTC, performance. now() returns the number of milliseconds/microseconds elapsed since an arbitrary epoch.

How do I reset my performance now?

What you can do is to save current performance. now() when the timer starts and just substract it afterwards. Looking at your code, simply set ´time = performance. now()´ again and you are done.


1 Answers

Almost all modern browsers provide a high resolution timer. It's the "High Resolution Time" W3C standard: http://www.w3.org/TR/hr-time/#sec-DOMHighResTimeStamp.

It allows you to get a sub-millisecond accurate timestamp by calling window.performance.now(). This returns a time stamp in ms, but it is a float so you still get sub-millisecond resolution.

Very old browsers may implement a "prefixed" version of this standard, e.g. WebKit based browsers used to implement window.performance.webkitNow()

Here is some code you can use to get the the accurate timestamp when available and fallback to standard precision otherwise:

if (window.performance.now) {     console.log("Using high performance timer");     getTimestamp = function() { return window.performance.now(); }; } else {     if (window.performance.webkitNow) {         console.log("Using webkit high performance timer");         getTimestamp = function() { return window.performance.webkitNow(); };     } else {         console.log("Using low performance timer");         getTimestamp = function() { return new Date().getTime(); };     } }  getTimestamp(); 

Note that this getTimestamp() function does not return a value that represents the current date/time. The returned value can only be used to measure time-periods, by subtracting two different timestamps. E.g.

var t1 = getTimestamp(); //... some other code var t2 = getTimestamp(); console.log("Time delta: " + (t2 - t1)); 
like image 116
h3r3 Avatar answered Sep 28 '22 23:09

h3r3