首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >防止AudioWorkletNode内存泄漏

防止AudioWorkletNode内存泄漏
EN

Stack Overflow用户
提问于 2019-04-03 20:25:18
回答 1查看 762关注 0票数 7

我有一个AudioWorkletNode,它是类实例的成员。当我删除/杀死/删除该实例时,AudioWorkletNode和MessagePort会泄漏。

在删除实例之前,我确保相应的AudioWorkletProcessor流程方法没有运行。我还尝试调用端口的close()方法,甚至将AudioWorkletNode设置为null。它似乎也不重要的节点是连接或断开在当时。不管是哪种方式都会泄露。

要建立audioWorklet模块:

代码语言:javascript
复制
AG_Recorder = class AG_Recorder {

  constructor(outNode) {

      AG_AudioManager.audioCtx.audioWorklet.addModule( '/audioWorkers/recorder.js').then(() => {

        this.recorderNode = new AudioWorkletNode(AG_AudioManager.audioCtx, 'recorder');
        this.recorderNode.connect(outNode);

        this.recorderNode.port.onmessage = (event) => {
          this.handleMessage(event.data);
        };

      }).catch(function (err) {
        console.log('recorder audioworklet error: ', err.name, err.message);
      });

   }
}

处理器,强烈缩写为相关性:

代码语言:javascript
复制
class RecorderWorkletNode extends AudioWorkletProcessor {

  constructor (options) {

    super(options);
    this._running = true;

    this.port.onmessage = event => {

      if (event.data.release) {
        this._running = false;
      }
    }

    this.port.start();
  }

  process (inputs, outputs, parameters) {

    return this._running;
  }
}

在断开节点并删除AG_Recorder实例之前,我尝试这样做:

代码语言:javascript
复制
release() {
    this.recorderNode.port.postMessage({release: true});
    this.recorderNode.port.onmessage = null;
    this.recorderNode.port.close();
    this.recorderNode = null;
 }
EN

回答 1

Stack Overflow用户

发布于 2022-03-04 16:29:01

这似乎是一个已证实的铬缺陷:

https://bugs.chromium.org/p/chromium/issues/detail?id=1298955

更新:不太确定Firefox等

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

https://stackoverflow.com/questions/55503719

复制
相关文章

相似问题

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