38 lines
811 B
JavaScript
38 lines
811 B
JavaScript
"use strict"
|
|
|
|
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))
|
|
}
|
|
}
|