crossbrowdy
Version:
A Multimedia JavaScript framework to create real cross-platform and hybrid game engines, games, emulators, multimedia libraries and apps.
80 lines (71 loc) • 3.29 kB
JavaScript
if (!Date.now) { Date.now = function() { return new Date().getTime(); } }
// @license http://opensource.org/licenses/MIT
// copyright Paul Irish 2015
// Added code by Aaron Levine from: https://gist.github.com/Aldlevine/3f716f447322edbb3671
// Some modifications by Joan Alba Maldonado.
// as Safari 6 doesn't have support for NavigationTiming, we use a Date.now() timestamp for relative values
// if you want values similar to what you'd get with real perf.now, place this towards the head of the page
// but in reality, you're just getting the delta between now() calls, so it's not terribly important where it's placed
// Gist: https://gist.github.com/jalbam/cc805ac3cfe14004ecdf323159ecf40e
// TODO: Think about adding vendor prefixes.
(function()
{
if (window.performance && window.performance.now) { return; }
window.performance = window.performance || {};
if
(
window.performance.timing && window.performance.timing.navigationStart &&
window.performance.mark &&
window.performance.clearMarks &&
window.performance.getEntriesByName
)
{
window.performance.now = function()
{
window.performance.clearMarks('__PERFORMANCE_NOW__');
window.performance.mark('__PERFORMANCE_NOW__');
return window.performance.getEntriesByName('__PERFORMANCE_NOW__')[0].startTime;
};
}
else if ("now" in window.performance === false)
{
var nowOffset = Date.now();
if (window.performance.timing && window.performance.timing.navigationStart)
{
nowOffset = window.performance.timing.navigationStart
}
window.performance.now = function now()
{
return Date.now() - nowOffset;
}
}
})();
// requestAnimationFrame polyfill by Erik Möller.
// Fixes from Paul Irish, Tino Zijdel, Andrew Mao, Klemen Slavic, Darius Bacon and Joan Alba Maldonado.
// Adapted from https://gist.github.com/paulirish/1579671 which derived from
// http://paulirish.com/2011/requestanimationframe-for-smart-animating/
// http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating
// Added high resolution timing. This window.performance.now() polyfill can be used: https://gist.github.com/jalbam/cc805ac3cfe14004ecdf323159ecf40e
// MIT license
// Gist:
(function() {
var vendors = ['webkit', 'moz', 'ms', 'o'], vp = null;
for (var x = 0; x < vendors.length && !window.requestAnimationFrame && !window.cancelAnimationFrame; x++)
{
vp = vendors[x];
window.requestAnimationFrame = window.requestAnimationFrame || window[vp + 'RequestAnimationFrame'];
window.cancelAnimationFrame = window.cancelAnimationFrame || window[vp + 'CancelAnimationFrame'] || window[vp + 'CancelRequestAnimationFrame'];
}
if (/iP(ad|hone|od).*OS 6/.test(window.navigator.userAgent) || !window.requestAnimationFrame || !window.cancelAnimationFrame) //iOS6 is buggy.
{
var lastTime = 0;
window.requestAnimationFrame = function(callback, element)
{
var now = window.performance.now();
var nextTime = Math.max(lastTime + 16, now); //First time will execute it immediately but barely noticeable and performance is gained.
return setTimeout(function() { callback(lastTime = nextTime); }, nextTime - now);
};
window.cancelAnimationFrame = clearTimeout;
}
}());
;