0

“非动态子代”是指另一个库符号预编译的子代,例如,其中一个库符号 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 变量,它通过每个类级联一个 destructor() 函数(大多数类都有自己的 destructor()),只要屏幕发生变化(也从显示列表中删除 current_screen 并将其设置为 null)。级联析构函数删除一个类的子级、所有它的侦听器并将其所有对象变量引用设置为 null(包括数组中的那些)。然而,每次创建新屏幕时内存使用量仍会稳步增加(current_screen = new Screen()),这表明它没有被正确地垃圾收集(最终导致滞后)。我不知道在析构函数类中我还能做什么,除了出于绝望开始删除纯图形的非动态子代。

4

1 回答 1

0

老实说,我在按照您的描述时遇到了一些麻烦,但希望我能提供一些我在垃圾收集方面的经验。

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

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

  • 将对象设置为null
  • 确保没有其他对象持有对该对象的引用,例如。array
  • 删除任何event listeners附加到这个对象
  • 正确销毁任何timersintervals
  • 销毁任何tweens在你的对象上工作的东西

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

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

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

您可以过滤所有对象的类路径以更轻松地找到您创建的对象,如果需要,如果内置类不在您尝试访问的对象中,请删除它们。

还有一个查找游荡对象按钮,但我从未依赖过它。

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

于 2012-07-06T15:24:21.213 回答