35 lines
759 B
JavaScript
35 lines
759 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
|
|
|
|
return function() {
|
|
var now = new Date()
|
|
|
|
// First render, OR if the time since the last render is greater
|
|
// than the frame budget
|
|
// just immediately render
|
|
if(!last || now - last > FRAME_BUDGET) {
|
|
last = now;
|
|
|
|
return render()
|
|
}
|
|
|
|
// Redraw already pending, abort
|
|
if(pending) {
|
|
return
|
|
}
|
|
|
|
// Schedule a redraw for the next tick
|
|
pending = rAF(function() {
|
|
render()
|
|
|
|
last = new Date()
|
|
pending = null
|
|
}, FRAME_BUDGET - (now - last))
|
|
}
|
|
}
|