Javascript 如何在Paper.js中从层中销毁特定(而不是删除)对象/路径/分组子对象

Javascript 如何在Paper.js中从层中销毁特定(而不是删除)对象/路径/分组子对象,javascript,canvas,paperjs,Javascript,Canvas,Paperjs,我正在制作一个无限期的动画。我在动画中使用了各种对象,这些对象从一个形状变换到另一个形状,然后我创建了一个新对象来代替那个位置并移除旧对象 示例: 有一个矩形对象,我修改了线段,将其转换为一个圆。然后我在同一点插入一个新的圆形对象,并删除旧的矩形对象。 当我将这些对象添加到组并修改它们时,也会发生类似的事情 问题: 当我删除对象时,我从路径中删除所有段,然后从javascript中使用delete关键字删除保存路径的对象 创建: var Obj = {}; Obj.line = new Path

我正在制作一个无限期的动画。我在动画中使用了各种对象,这些对象从一个形状变换到另一个形状,然后我创建了一个新对象来代替那个位置并移除旧对象

示例: 有一个矩形对象,我修改了线段,将其转换为一个圆。然后我在同一点插入一个新的圆形对象,并删除旧的矩形对象。 当我将这些对象添加到组并修改它们时,也会发生类似的事情

问题: 当我删除对象时,我从路径中删除所有段,然后从javascript中使用
delete
关键字删除保存路径的对象

创建:

var Obj = {};
Obj.line = new Path.Line({
    segments: [new Point.random() * view.size, new Point.random() * view.size],
    storkeColor: 'black',
    fillColor: 'black'
});
Obj.vector = new Point({
    angle: 360 * Math.random(),
    length: Math.random() * 10
});
删除:

Obj.line.removeSegments();
delete Obj;
使用这种方法,线将从场景中移除,动画将继续

问题:

var Obj = {};
Obj.line = new Path.Line({
    segments: [new Point.random() * view.size, new Point.random() * view.size],
    storkeColor: 'black',
    fillColor: 'black'
});
Obj.vector = new Point({
    angle: 360 * Math.random(),
    length: Math.random() * 10
});
1)这行在内存中是否留下任何痕迹?彻底摧毁这个物体的最好方法是什么?因为这个过程会重复多次,我担心会影响性能的内存问题

2)分组时相同。我使用
group.removeChildren()
删除了组子项,在文档中提到,这些子项不会被销毁,可以添加回场景中。 使用
group.removeChildren()后,它们是否仍存在于内存中?如果是,摧毁它们的最佳方式是什么

我试图找出如何销毁这些对象而不是移除它们,但没有找到任何解决方案。请询问您是否需要有关此的更多详细信息

提前谢谢


编辑:我找到了一个可能的解决方案,那就是删除图层本身。我不是在找那个,因为所有其他对象都在同一层中,所以删除该层也会删除这些对象。

如果删除该项,则在文件中没有对它的引用,因此如果在代码中不保留对它的引用,它最终将在垃圾收集中被清除。JavaScript没有一种方法来实际删除一个对象;正如@Pogrindis所指出的,它所做的只是从对象中删除属性。这会间接导致垃圾收集,通过删除对对象的引用释放内存,但不会释放内存本身


这是一个创建10000个对象并将其覆盖10次的方法。如果你为内存使用创建一个Chrome时间线,你会看到内存使用在完成后会稳定到基线。Net:当调用
item.remove()
时,似乎paper正在释放对项的所有引用。

仅与#1相关-您是否看到内存泄漏症状?delete操作符仅在aik时删除属性。。你可以通过@Pogrindis找到这个,目前我还在制作动画,所以还没有注意到任何症状。但是我想在它太晚之前考虑它。谢谢,链接很有用谢谢你的解释。我希望它能起作用。我会在完成动画并确保它如您所解释的那样工作后接受答案。如果它对您有效,如果您愿意接受答案,那就太好了。你投了更高的票,但没有接受。谢谢随着时间的推移,内存堆栈仍在增加,另外还有一个问题与纸张js有关。不过你的回答很有帮助。我可以接受一个问题的多个答案吗?谢谢你的跟进。不,每个问题不能接受一个以上的答案,但我看不到这个问题的其他答案。您可能想查看Chrome的内存使用调试工具。这里是一个很好的起点: