35 lines
857 B
JavaScript
35 lines
857 B
JavaScript
|
var tick = 1
|
||
|
var maxTick = 65535
|
||
|
var resolution = 4
|
||
|
var inc = function() {
|
||
|
tick = (tick + 1) & maxTick
|
||
|
}
|
||
|
|
||
|
var timer = setInterval(inc, (1000 / resolution) | 0)
|
||
|
if (timer.unref) timer.unref()
|
||
|
|
||
|
module.exports = function(seconds) {
|
||
|
var size = resolution * (seconds || 5)
|
||
|
var buffer = [0]
|
||
|
var pointer = 1
|
||
|
var last = (tick-1) & maxTick
|
||
|
|
||
|
return function(delta) {
|
||
|
var dist = (tick - last) & maxTick
|
||
|
if (dist > size) dist = size
|
||
|
last = tick
|
||
|
|
||
|
while (dist--) {
|
||
|
if (pointer === size) pointer = 0
|
||
|
buffer[pointer] = buffer[pointer === 0 ? size-1 : pointer-1]
|
||
|
pointer++
|
||
|
}
|
||
|
|
||
|
if (delta) buffer[pointer-1] += delta
|
||
|
|
||
|
var top = buffer[pointer-1]
|
||
|
var btm = buffer.length < size ? 0 : buffer[pointer === size ? 0 : pointer]
|
||
|
|
||
|
return buffer.length < resolution ? top : (top - btm) * resolution / buffer.length
|
||
|
}
|
||
|
}
|