销毁从舞台上移除的对象(及其子对象)

时间:2012-01-25 12:43:42

标签: flash actionscript-3 actionscript

我正在使用几乎完全用ActionScript 3编写的Flex / Air应用程序(使用PureMVC)(即我们使用很少的Flex)。视图组件被添加到主应用程序窗口中的Canvas对象,然后这些视图加载其他影片剪辑,图像文件等。

当我从舞台中删除视图时,我使用application.canvas.removeChild(...)这样做。这会在我的PureMVC中介中为该视图触发一个事件,该事件将删除所有已设置的事件侦听器,并且所有内容都显示为花花公子。

但是,影片剪辑仍在后台播放。它们不会在屏幕上造成任何麻烦...但它们只是在那里,在内存中播放(例如我可以看到它们的trace语句)并且我希望它们消失。我怀疑从Canvas中删除的View仍然存在,但我无法证明它。

将视图设置为null不会执行任何操作。我很惊讶AS3没有包含任何方法来简单有效地销毁显示对象及其所有子节点。

这是唯一的方法来繁琐地卸载所有的电影剪辑等,然后希望Flash能够清理它们吗?

2 个答案:

答案 0 :(得分:2)

AS3是一种垃圾收集语言,因此没有明确的命令从内存中删除对象。但是,AS3 VM确实进行引用计数,因此如果从阶段中删除显示对象并删除对该对象的所有引用,该对象将立即或很快被销毁,因此您将不会更长时间看它的跟踪陈述等。

如果您已删除对象的所有明显引用但未收集,则问题可能是循环引用。例如,父对象和子对象相互引用,因此上述处理将不会知道删除它们,除非您取消所有内容。在这些情况下,在发生垃圾收集(即标记扫描)之前,不会从内存中删除对象。 (GC相对较慢,因此玩家内部基于可用内存量和其他因素进行优化。)

顺便提一下,以上所有所有对象都是如此,无论它们是显示对象还是Flex Views或NetStreams等等。有关AS3 GC的here's a good overview的更多信息 - 它已经过时但仍然正确。

但是作为一名程序员,你应该理解的是,几乎在所有情况下,你都不应该担心这一点。删除所有对象的引用(如果它们正在播放,则为stop()),让(经过大量优化的)内部GC决定它们何时实际消失。如果内存变得稀缺,那么GC将会起作用,如果没有,那么任何额外的内存管理都只是过早的优化。

答案 1 :(得分:0)

这里有两件事

  1. 如果您尝试删除应用程序动态生成的影片剪辑,那么简单的removeChild或removeChildAt将有效地将其从舞台中删除。实际上,将变量设置为null。
  2. 如果影片剪辑是外部加载swf'与音频/视频数据,那么你必须按正确的顺序卸载所有这些。停止 - >卸载 - >从stage中删除loader - >销毁变量(根据需要)。
  3. 根据flash播放器的版本,你有各种unloadAndStop类型的soundmixer类stopAll方法和方法。

    只有在退出整个应用程序时,清理工作才会出现。