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