首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Web Audio API:性能问题?

Web Audio API:性能问题?
EN

Stack Overflow用户
提问于 2020-02-15 03:56:22
回答 1查看 237关注 0票数 2

我这里有个小编钟制作人。它同时生成多个泛音,并在每个泛音上使用可变增益来产生丰富的钟声。我调用一个函数来按顺序播放一系列这些内容。但如果我快速按下按钮几次,声音输出就会停止,就像内存耗尽一样:

https://codepen.io/ophello/pen/OJVRMQe

代码语言:javascript
复制
function ding(freq) {
    var toneGen = new AudioContext()
    var duration = 15
    var T = toneGen.currentTime
    var overtones = [1,2.76,5.4,8.93,13.34,18.64]
    overtones.forEach(function(overtone,i) {
        var osc = toneGen.createOscillator()
        osc.type = "sine"
        var freqVal = freq * overtone
        if (freqVal <= 22050) {
            osc.frequency.value = freq * overtone
            var envelope = toneGen.createGain()
            osc.connect(envelope)
            envelope.gain.setValueAtTime(0.1/Math.pow((i+1),5), T)
            envelope.gain.exponentialRampToValueAtTime(0.00001, T + duration)
            envelope.connect(toneGen.destination)
            osc.start(T)
            osc.stop(T + duration)
        }
    })
}

var hzValues = [216, 288, 324, 405, 432, 648]

$("#b1").mousedown(() => { 
    hzValues.forEach((thisHz,i) => { 
        setTimeout(() => { ding(thisHz) }, 100 * i); 
    })
})

为什么这个在按了几次之后就停止工作了?我是不是漏掉了什么关键的东西?我不知道在控制台的什么地方寻找与此有关的任何问题。这是内存问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-15 04:58:14

多亏了上面的dandavis,我通过添加超时函数实现了这一点:

代码语言:javascript
复制
setTimeout(toneGen.close.bind(toneGen), duration*1000);

更新:通过将音频上下文移出main函数进行了改进!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60232724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档