Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
This is a sandbox to understand the list-based approach as put forward by @jonasfj. Mainly targeting Webkit 533.1 in order to gain some form of rendering framerate control on android 2 devices.
// http://paulirish.com/2011/requestanimationframe-for-smart-animating/
// http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating
// requestAnimationFrame polyfill by Erik Möller
// fixes from Paul Irish and Tino Zijdel
// list-based fallback implementation by Jonas Finnemann Jensen
(function() {
var vendors = ['ms', 'moz', 'webkit', 'o'];
for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];
window.cancelAnimationFrame =
window[vendors[x] + 'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];
}
if (!window.requestAnimationFrame)
{
var timeoutId = null, currentCallbackStack = [], totalCallbacksExecutedCounter = 0, timestamp = 0;
function animate()
{
var callbackIdx,
callbacksToAnimate = currentCallbackStack,
len = currentCallbackStack.length;
timeoutId = null;
timestamp = Date.now();
currentCallbackStack = [];
totalCallbacksExecutedCounter += callbacksToAnimate.length;
for (callbackIdx = 0; callbackIdx < len; callbackIdx += 1) {
if (callbacksToAnimate[callbackIdx])
callbacksToAnimate[callbackIdx](timestamp);
}
}
window.requestAnimationFrame = function(callback)
{
if (timeoutId == null)
timeoutId = window.setTimeout(animate, Math.max(0, 20 + timestamp - Date.now()));
return currentCallbackStack.push(callback) + totalCallbacksExecutedCounter;
};
window.cancelAnimationFrame = function(requestId)
{
delete currentCallbackStack[requestId - totalCallbacksExecutedCounter - 1];
};
}
}());
@Philzen

This comment has been minimized.

Copy link
Owner Author

Philzen commented Feb 18, 2013

Changelog:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.