【问题标题】:WebAudio: total oscillator count and performance (Javascript)WebAudio:振荡器总数和性能(Javascript)
【发布时间】:2017-08-10 02:16:05
【问题描述】:

我正在创建很多这样的 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;    
}

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

我想知道,AudioContext 中可以处理的振荡器数量是否有上限?如果我启动一大堆振荡器并且从不停止它们,是否会出现一些潜在的性能问题?

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

【问题讨论】:

    标签: javascript performance web-audio-api


    【解决方案1】:

    您可以有效使用的振荡器数量仅受您机器的强大程度的限制。低功率机器在出现故障之前只能支持几个同时振荡器。一台高性能的机器可以处理更多的事情。

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

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

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

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

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

    【讨论】:

    • 好的,谢谢你的信息!但是,我不确定我是否遵循关于停止振荡器的部分。问题是停止振荡器意味着必须重新创建它以“重新启动”它。 (这就是我让它们运行的​​原因。)据我所知,这涉及到每次动态创建它们(即:动态变量创建)。你能提供一些关于如何做到这一点的编码解决方案吗?
    • 我认为这取决于你想做什么。如果您有一组应该始终在播放的振荡器,因为您稍后会更改增益,那么您就可以了。如果您正在做类似合成器的事情,那么您肯定希望他们停止并根据需要重新创建新的。不知道正确答案是什么,因为您没有说出应用程序是什么。
    • 我将重新表述动态振荡器。你回答了我的主要问题。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多