2017-08-09 94 views
0

我创造很多这些类型的WebAudio仪器的对象:WebAudio:总振荡器计和性能(JavaScript)的

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中处理?如果我启动一大堆振荡器并永不停止,是否会出现一些潜在的性能问题? (注意:如果这是一个推荐的方法,我很乐意提供关于如何每次动态创建一个新的振荡器的建议......我还没有想到这一点,毕竟我并不确定这是需要的。)

回答

1

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

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

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

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

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

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

+0

好的,感谢这个信息!但是,我不确定我是否遵循了停止振荡器的部分。问题是停止振荡器意味着它必须重新创建以“重启”它。 (这就是为什么我要让它们继续运行。)据我所知,每次都会动态创建它们(即:动态变量创建)。你可以提供一些编码解决方案,如何做到这一点? –

+1

我认为这取决于你想要做什么。如果你有一套应该一直在玩的振荡器,因为你稍后会改变增益,那么你就没问题。如果你正在做一个合成器的东西,那么你肯定希望他们停下来并根据需要重新创建新的合成器。不知道正确答案是什么,因为你没有说出应用程序是什么。 –

+0

我会再次重申动态振荡器。你回答了我的主要问题。谢谢! –