Javascript 使用p5.js使用createGraphics()生成的对象不会被垃圾收集

Javascript 使用p5.js使用createGraphics()生成的对象不会被垃圾收集,javascript,memory-leaks,p5.js,Javascript,Memory Leaks,P5.js,我正在做一个简单的草图,我想给用户提供撤销功能。为此,我决定跟踪用户在使用createGraphics()创建的对象中创建的每个笔划(画一条线,更改颜色,…),而该对象又在一个类似堆栈(LIFO)的数组中进行管理。在一些测试之后,我注意到浏览器使用的内存量从未减少,并且在中读取,必须使用删除()来解决该问题,但我没有这样做 因为我找不到关于它的很多信息,所以我假设remove()方法可以正常工作,问题出在我的实现中。下面是一个非常简单的骨骼草图,它复制了这个问题: function setup(

我正在做一个简单的草图,我想给用户提供撤销功能。为此,我决定跟踪用户在使用createGraphics()创建的对象中创建的每个笔划(画一条线,更改颜色,…),而该对象又在一个类似堆栈(LIFO)的数组中进行管理。在一些测试之后,我注意到浏览器使用的内存量从未减少,并且在中读取,必须使用删除()来解决该问题,但我没有这样做

因为我找不到关于它的很多信息,所以我假设remove()方法可以正常工作,问题出在我的实现中。下面是一个非常简单的骨骼草图,它复制了这个问题:

function setup(){
    c = createCanvas(windowWidth, windowHeight);
    mouseClicked = mo;
}

function mo(){
    let ppp = createGraphics(5000, 5000); // oversized to make the memory usage obvious
    ppp.background(color(random(255), random(255), random(255)));
    image(ppp, 0, 0);
    ppp.remove();
    ppp = null;
}
前面的代码段每次单击都将使用大约100MB的内存,但有趣的是,只有在第三次单击之后才开始这样做


我怎么做错了?如何成功删除使用createGraphics()创建的对象并释放它使用的内存?

显然,问题出在p5库中,特别是在p5.Graphics.js中。幸运的是,擅长github的人获得了成功。目前,可以通过使用以下命令重写remove函数来解决此问题:

p5.Graphics.prototype.remove = function() {
    if (this.elt.parentNode) {
      this.elt.parentNode.removeChild(this.elt);
    }
    var idx = this._pInst._elements.indexOf(this);
    console.log(this._pInst);
    if (idx !== -1) {
      this._pInst._elements.splice(idx, 1);
    }
    for (var elt_ev in this._events) {
      this.elt.removeEventListener(elt_ev, this._events[elt_ev]);
    }
};