WebAudio:总振荡器数量和性能(Javascript)

时间:2017-08-09 03:06:40

标签: javascript performance web-audio

我正在创建许多这类WebAudio工具对象:

var context = new AudioContext();

Inst = function (id, param){
  var inst = {
    id = id,
    param = param
  }
  inst.osc = context.createOscillator();
  inst.gain = context.createGain();
  inst.osc.connect(inst.gain);
  inst.gain.connect(context.destination)
  inst.gain.gain.value = 0;
  inst.osc.start();

  inst.playTone = function () {
    inst.gain.gain.setTargetAtTime(1, context.currentTime, 0.1);        
  } 
  inst.stopTone = function () {
    inst.gain.gain.setTargetAtTime(0, context.currentTime, 0.1);        
  }     
instList[id] = inst;    
}

正如你所看到的,我只是提高和降低音量。在.start()函数中使用.stop()inst.是有问题的,因为.stop会终止振荡器,并且用户将与这些对象重复交互。

我想知道,AudioContext中是否有最大数量的振荡器可以处理?如果我启动一大堆振荡器并且永远不会阻止它们,是否存在一些潜在的性能问题?

(旁注:如果这是推荐的方法,我愿意接受每次如何动态创建新振荡器的建议......我还没想出来,毕竟我不确定它是什么需要的。)

1 个答案:

答案 0 :(得分:1)

您可以有效使用的振荡器数量仅受机器功能强大的限制。低功耗的机器在毛刺之前只能支持几个同时的振荡器。高性能机器可以处理更多。

你不想让振荡器永远运行,因为它们会烧掉所有可用的CPU。

由于经过一段时间后增益会变为零,所以可以做的是在增益变为零后安排振荡器停止。一般的经验法则是使用setTargetAtTime中使用的时间常数的5-10倍。所以在stopTone中包括类似的内容:

inst.osc.stop(context.currentTime + 0.1*10)

其中0.1是setTargetAtTime中使用的时间常数值。

这将停止振荡器,因此它们不会吸收所有CPU播放到零增益增益节点。