正确的间隔javascript漂移

时间:2017-06-07 05:14:11

标签: javascript math timer drift

这可能是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)恢复率,还是有解决方案可以提高数学意义?

0 个答案:

没有答案