Вот соответствующие спецификации:
Следующие поведения обеспечивают нормативное описание условий, при которых AudioNode жив, что означает, что он ДОЛЖЕН быть сохранен в графе реализацией. Если эти условия не применяются, AudioNodes МОГУТ быть освобождены реализацией.
Существует несколько типов ссылок:
Обычная ссылка, подчиняющаяся обычным правилам сборки мусора.
Эталон воспроизведения для AudioBufferSourceNodes, MediaElementAudioSourceNodes, MediaStreamAudioSourceNodes и OscillatorNodes. Эти узлы сохраняют игровую ссылку на себя, пока они в данный момент играют.
Ссылка на соединение, которая возникает, если другой AudioNode подключен к одному или нескольким его входам. Соединения с AudioParams узла не подразумевают ссылку на соединение.
Ссылка на хвостовое время, которую AudioNode поддерживает сам по себе, пока у него есть какое-либо внутреннее состояние обработки, которое еще не было передано. Например, ConvolverNode имеет хвост, который продолжает играть даже после получения беззвучного ввода (представьте, что вы хлопаете в ладоши в большом концертном зале и продолжаете слышать, как звук разносится по всему залу). Некоторые AudioNodes имеют это свойство. См. подробности для конкретных узлов.
MediaStreams поддерживает MediaStreamAudioSourceNode в активном состоянии до тех пор, пока базовый MediaStreamTrack, который воспроизводится через MediaStreamAudioSourceNode, не закончился (согласно [mediacapture-streams]).
HTMLMediaElements поддерживает связанный с ними MediaElementAudioSourceNode, пока HTMLMediaElement находится в состоянии, когда звук может быть воспроизведен в будущем.
Таким образом, в случае, например, AudioBufferSourceNode, поскольку он не имеет ни input(3), ни tail-time(4), он не связан с внешним MediaStream( 5) или MediaElement(6), если вы не сохраняете ссылку на узел в своем js-коде(1), и что узел закончил воспроизведение(2), то его можно удалить из графа, а затем мусор Собрано.
Также обратите внимание, что большинство узлов source в любом случае имеют очень небольшой отпечаток пальца.
Если мы снова возьмем в качестве примера AudioBufferSourceNodes, то вы должны понимать, что они не дублируют AudioBuffer, они просто ссылаются на него.
Таким образом, создавая тысячи AudioBufferSourceNodes из одного и того же AudioBuffer.
Однако создавать тысячи AudioBuffers из одного и того же ArrayBuffer или тысячи ArrayBuffers из одного и того же файла или и то, и другое совсем не годится, так что Убедитесь, что при обработке события щелчка все, что вы делаете, — это создаете новый AudioBufferSourceNode из уже существующего AudioBuffer.
person
Kaiido
schedule
20.03.2019