【问题标题】:Destroying objects (and their children) removed from the stage销毁从舞台上移走的物体(及其孩子)
【发布时间】:2012-02-18 15:36:21
【问题描述】:

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

当我从舞台上删除视图时,我使用application.canvas.removeChild(...) 这样做。这会在我的 PureMVC 中介器中为该视图触发一个事件,该事件会删除任何已设置的事件侦听器,并且一切看起来都很花哨。

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

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

唯一的方法是繁琐地卸载所有影片剪辑等,然后希望 Flash 将它们清理干净吗?

【问题讨论】:

    标签: flash actionscript-3 actionscript


    【解决方案1】:

    AS3 是一种垃圾收集语言,因此没有明确的命令可以从内存中删除对象。但是,AS3 VM 确实会进行引用计数,因此如果您从舞台中删除一个显示对象并删除对该对象的所有引用,该对象将立即或很快被销毁,因此您不会不再查看它的跟踪语句等。

    如果您删除了对该对象的所有明显引用,但它没有被收集,则问题可能是循环引用。例如,父对象和子对象相互引用,因此除非您取消所有内容,否则上述处理不会知道删除它们。在这些情况下,对象不会从内存中删除,直到发生垃圾收集(即标记清除)。 (GC 相对较慢,因此播放器内部会根据可用内存量和其他因素在它们发生时进行优化。)

    顺便说一句,以上所有内容都适用于 所有 对象,无论它们是显示对象还是 Flex Views 或 NetStreams 或其他什么。如需更多信息,请联系 AS3 GC 的 here's a good overview - 它虽旧但仍然正确。

    但是作为一名程序员,你应该明白的是,在几乎所有情况下,你都不应该担心这一点。删除所有对对象的引用(如果它们正在播放,则删除 stop() 它们),并让(高度优化的)内部 GC 决定它们何时真正消失。如果内存变得稀缺,那么 GC 就会采取行动,如果没有,那么任何额外的内存管理都只是过早的优化。

    【讨论】:

    • 我打算发布我自己的答案,但我最终会说同样的话(+1),但我要补充的一件事是 eventListeners 是保持实例存活的罪魁祸首长于应有的时间。如果您无法显式分离处理程序,则将处理程序添加为 weak references 会有所帮助。
    • 同时使用适当的分析器(如 Flash Builder Pro 中的分析器)是获取有关内存使用和 GC 行为的一些硬数据的更好方法。
    • 是的,弱处理程序是个好主意,我希望它们是默认的。如果在这种情况下确实有一个框架正在处理它们,那么它们可能不是问题,但还是有好处的。
    • 删除引用然后停止它们?不是反过来吗?
    【解决方案2】:

    这里有两件事

    1. 如果您尝试删除应用程序动态生成的影片剪辑,那么简单的 removeChild 或 removeChildAt 将有效地将其从舞台上删除。在实践中将变量设置为 null。
    2. 如果影片剪辑是从外部加载带有音频/视频数据的 swf',那么您必须以正确的顺序将它们全部卸载。停止->卸载->从阶段删除加载器->销毁变量(根据需要)。

    根据 Flash 播放器的版本,您有各种 unloadAndStop 类型的方法和混音器类 stopAll 的方法。

    只有当您退出整个应用程序时,清理才会出现。

    【讨论】:

    • 两件事:首先,垃圾收集器会动态清理对象,而不仅仅是在退出时。其次,GC 问题通常适用于外部加载的剪辑。即使Loader.unloadAndStop() 也不会在 GC 看到仍然有对它的引用时从内存中获取剪辑。
    • 同意,我相信我并没有说任何反驳的话。删除引用是它的一个模糊的简短版本,我只是说明了它的一些实现实例。未能删除引用不会删除不需要的对象,直到退出。
    猜你喜欢
    • 2014-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多