AS3垃圾收集 - 非动态儿童得到this.parent参考?

时间:2012-07-06 12:38:33

标签: actionscript-3 garbage-collection

“非动态儿童”是指另一个图书馆符号预编译的孩子,例如,图书馆符号MC_1包含一个实例MC_2 - MC_1是为动作脚本导出的,MC_1是通过使用其名称来解决的(让我们说instance_1)。 在这种情况下,MC_2是否仍会获得对MC_1的this.parent引用,该引用会将其绑定并阻止垃圾收集器执行其业务?我是否必须(在MC_1的AS3文件中)removeChild(instance_1)并将instance_1设置为null?即使MC_2没有在代码中给出任何引用?

我从垃圾收集中学到的东西(在我读过的20多篇文章中都没有用)告诉我答案可能是我不必删除这些引用,但我问,因为这是关于我唯一没试过的事。

我在游戏中有一个DocumentClass current_screen变量,每当更改屏幕时,它都会通过每个类级联析构函数(大多数类都有自己的析构函数())(同时从显示列表中删除current_screen并将其设置为null )。级联析构函数删除一个类'children,所有它的侦听器,并将其所有对象变量引用设置为null(包括数组中的那些)。然而,每次创建新屏幕时,内存使用量仍然稳定增加(current_screen = new Screen()),表明它没有被正确地垃圾收集(最终导致滞后)。我不知道在析构函数类中我还能做什么,除了开始从纯粹的绝望中删除纯粹的图形非动态子项。

1 个答案:

答案 0 :(得分:0)

我必须诚实,我对你的描述有点麻烦,但希望我可以提供一些垃圾收集的经验。

我的经验是使用Flash Builder分析器。

正如您在所有阅读过的文章中找到的那样,在Flash中有效进行垃圾收集的关键是确保对象被取消引用。这是通过以下方式实现的:

  • 将对象设置为null
  • 确保没有其他对象持有对象的引用,例如。 array
  • 删除附加到此对象的任何event listeners
  • 正确销毁任何timersintervals
  • 销毁正在处理对象的任何tweens

以上内容也适用于嵌套在相关对象中的任何对象。

使用Flash Builder,我的工作流程将涉及运行探查器,然后在特定时间点执行快照,然后单击运行垃圾收集器按钮。等待图表更新通常证明垃圾收集已经运行后,我会再次快照。

接下来,您可以查看这两个快照并进行比较,您将能够看到哪些对象仍然存在。如果他们是你,你可以检查他们,并尝试找出他们持有的东西。

您可以过滤所有对象的类路径以更轻松地创建您创建的对象,如果需要,可以删除内置类,如果它们没有计入您想要访问的对象。

还有一个寻找游荡物体的按钮,但我从来没有依赖它。

由于您无法控制运行GC的时间(至少不在浏览器中),因此无法保证何时运行GC。因此,当GC决定时,内存可能会增加并收集,但如果您使用Flash构建器进行分析,则可以使用此方法向自己证明,如果在运行garbagbe集合时收集了对象,那么当您允许GC时它也会起作用在自己的时间处理它。