mithril-vndb/api/limiter.js
Pat Cavit 0cf509f674 Add forcing support and improve tests
Also verify that we're using tabs, whee.
2016-05-19 10:59:41 -07:00

36 lines
797 B
JavaScript

var FRAME_BUDGET = 16 // 60 frames per second = 1 call per 16 ms
module.exports = function($window, render) {
var rAF = $window.requestAnimationFrame || $window.setTimeout
var cAF = $window.cancelAnimationFrame || $window.clearTimeout
var last = 0
var pending = null
return function(force) {
var now = new Date()
// Immediately render if:
// Forced
// Haven't rendered yet
// Time since the last render is greater than the frame budget
if(force || !last || now - last > FRAME_BUDGET) {
last = now;
return render()
}
// Redraw already pending, abort
if(pending !== null) {
return
}
// Schedule a redraw for the next tick
pending = rAF(function() {
render()
last = new Date()
pending = null
}, FRAME_BUDGET - (now - last))
}
}