这可能是Javascript或数学问题。
我试图制作一个不会偏离系统时钟的间隔。我还需要能够在运行时更改间隔,因此大多数cron库都不能达到目的。我所说的时间尺度是10-5000毫秒。我担心的不是微精确定时,而是从长远来看零漂移。
我做了一个设置间隔的简单解决方案,回调函数比较了间隔运行的次数,并将其除以" interval"的所有时间。一直在运行。总时间/迭代将给出迭代产生的精确的总体漂移。这确保不会累积漂移。测量从上次运行迭代开始的时间并不能保证不会累积漂移。我的例子每次播放midi音符"准确"间隔"
测试应用:
var targetInterval=(60000/120)/4;
var lastDrift=0;
var jazz = require('jazz-midi');
var midi = new jazz.MIDI();
var name = midi.MidiOutOpen(0);
if(name){
console.log('Default MIDI-Out port:', name);
} else {
console.log('Cannot open default MIDI-Out port!');
}
var absoluteInterval=0;
var absoluteDrift=0;
var timeAnchor=0;
var iterations=0;
function a(){
var now=new Date();
var elapsed=now-timeAnchor;
console.log("tick");
iterations++;
absoluteInterval=(elapsed/iterations);
absoluteDrift=targetInterval-absoluteInterval;
setTimeout(function() {
a();
}, targetInterval+absoluteDrift);
console.log(" Interval:"+absoluteInterval);
console.log(" drift:"+absoluteDrift);
midi.MidiOut(0x99,(Math.random()*60)+40,100);
}
function changeRate(to){
targetInterval=to;
iterations=0;
timeAnchor=new Date();
}
function start(){
timeAnchor=new Date();
a();
}
start();
我现在的问题是,当费率发生变化时,漂移恢复很慢。实际上,漂移恢复是无限的,因为targetInterval-(经过/迭代);总是接近零,但它永远不会变为零;因此,添加到间隔的额外费用恰好不足以满足要求。我尝试过倍增,但这导致了夸大的恢复间隔,同样的数学原理仍然存在,无论如何都要避免完全恢复。我应该尝试量化(ceil)恢复率,还是有解决方案可以提高数学意义?