使用WebAudio API的内存高效代码

时间:2015-10-16 04:51:15

标签: html5 audio web-audio

我正在开发HTML5游戏并使用Web Audio API进行声音处理。我有一个问题,声音开始减慢,因为游戏进度和游戏也开始感觉抽搐,我猜是由于java脚本GC做内存清理。我在游戏中有两种类型的声音: 1)连续循环的背景声音 2)由于游戏中的某些事件非常频繁地发生跳跃声音,命中声音等。例如:用枪射击多发子弹。 不知道我做错了什么,请帮忙。请参考以下代码

function play(){
    this.startTime = this.actx.currentTime;
    this.soundNode = this.actx.createBufferSource();
    this.soundNode.buffer = this.buffer;
    this.soundNode.connect(this.volumeNode);

    //If there's no reverb, bypass the convolverNode
    if (this.reverb === false) {
        this.volumeNode.connect(this.panNode);
    }
    //If there is reverb, connect the `convolverNode` and apply
    //the impulse response
    else {
        this.volumeNode.connect(this.convolverNode);
        this.convolverNode.connect(this.panNode);
        this.convolverNode.buffer = this.reverbImpulse;
    }

    this.panNode.connect(this.actx.destination);
    this.soundNode.loop = this.loop;

    this.soundNode.playbackRate.value = this.playbackRate;
    this.soundNode.start(
        this.startTime,
        this.startOffset % this.buffer.duration
    );
    this.playing = true;
 }

1 个答案:

答案 0 :(得分:2)

除了使用卷积器(这可能非常昂贵并且会导致低端设备性能不佳)之外,代码中没有任何内容可以像内存密集型一样突出。我试过这个:

  1. 尝试禁用音频(不要运行任何音频代码,不要将其静音)。你还有游戏视觉效果中的janks吗?如果是这样,那不是你的音频的罪魁祸首。

  2. 尝试运行音频,但始终在没有卷积机的情况下运行。如果jank消失,那么卷发器就是你的罪魁祸首。我唯一能想到的就是尝试只设置一次卷积器缓冲区而不是每次调用play()。

  3. 尝试在Chrome开发工具(JS,Memory,Paints等)中运行不同的配置文件,并尝试找出janks的来源。 https://developer.chrome.com/devtools/docs/cpu-profiling

  4. 祝你好运!