Flash CS3 - 如何清理内存

时间:2011-05-04 19:05:50

标签: actionscript-3 flash-cs3

我有一个问题如何在闪存中清除/释放内存?例如,我正在完成游戏,我想从头开始,如果我只是跳到第一帧,所有对象仍然存在于此内存中,是否有可能强制清理内存?

我可以为对象释放内存吗?例如我removeChild(某事) - 我想为一个对象释放内存,因为我将重用它?

有人能解释一下发动机是如何工作的吗?

谢谢

3 个答案:

答案 0 :(得分:2)

我建议你阅读“Moock Book”中的第14章“垃圾收集”(O'Reilly Publishing的Essential ActionScript 3.0)。

你的问题的简短回答是,你无法控制解除分配,垃圾收集器是。在像AS3或Java这样的垃圾收集语言中,您没有像低级语言那样手动控制内存的分配和取消分配;没有AS3等同于C ++中的删除或C中的免费之类的东西。你的目标不应该在你破坏东西时控制,而是不要忘记删除引用你不再需要的东西,并确保禁用你打算进行垃圾收集的东西

AS3中的内存泄漏通常来自新手误解的混合(例如思考removeChild或设置对null的引用会破坏对象),以及不能很好地跟踪对象的引用 - 尤其是在涉及强大的侦听器的情况下。

之前的一位受访者发布了这个:

myObject = null;

这样做是删除对myObject所持有的变量的对象的引用。而已。您需要了解更多有关情况的信息,以便能够说明此分配是否使得有问题的对象有资格进行垃圾回收,尤其是有多少其他变量持有对该对象的引用。并且 该对象可能已经有资格进行垃圾回收,即使您没有将引用设置为null (即,如果myObject没有连接到GC根目录)。

可以说,整个GC机制比StackOverflow帖子中令人满意的解释更复杂。这就是为什么它在Moock Book中有一整章,甚至那本书也没有详细介绍Flash Player何时进行引用计数删除或标记和扫描传递的实现细节或详细信息。

最重要的事情要记住,恕我直言:

  1. 当你打算“杀死”一个对象时,给它一个cleanUp()或destroy()函数,你可以在这里执行诸如停止所有定时器,声音,删除监听器等操作。对象将继续存在并执行代码,直到它获得GC。只要可以,Flash Player就会推迟GC - 它通常在播放器需要从系统分配更多RAM时触发,因为分配内存是唯一比执行标记和扫描GC传递更耗时的事情。 / p>

  2. 了解弱势与强势听众。基本上,当您有一个弱侦听器时,侦听器引用是标记和扫描GC忽略的引用,因此它本身不会阻止对象被收集。但是不要听任何告诉你“总是使用弱者”或“总是使用强大的听众并手动删除它们”的人,因为有时候每个人都适合,这就是为什么选择你的原因。

答案 1 :(得分:1)

removeChild()将从舞台中移除对象,但仍会将其保留在内存中。如果您希望完全摆脱它,则必须nullmyObject = null这样的对象。您可能不需要这样做。在大多数情况下,只需将其从舞台中删除并删除所有相关事件就足够了。

答案 2 :(得分:1)

使用Flash清除内存是一件棘手的事情,正确的方法是在第一次播放中正确设置对象以便于清除,而不是强制删除。如果要从内存中删除对象,可以通过删除对它的任何引用来执行此操作,然后将其标记为垃圾回收。然后稍后Flash将从内存中删除该对象。

为了使对象准备好进行数据收集,它不能与另一个对象建立任何连接。

因此,如果您有一个与MovieClip有单一连接的对象且影片剪辑没有其他关系,那么如果您将其设置为null,则会将其删除。

但是,如果您有两个指向它的对象,如果通过将其设置为null来删除一个链接,则不会删除MovieClip。

此外,如果您有2个或更多具有连接网络的影片剪辑,则删除这些对象也需要打破这些连接。例如,如果您设置了一个包含许多字符和侦听器的级别,则删除lavel movieClip将不会清除它。

打破这些连接的一种方法是添加onRemovedFromStage事件,删除更多的子项,侦听器和对象。我已经开始使用movieclip的casaLib扩展名 - CasaMovieClip,它有一个名为removeChildrenAndDestroy的函数。这使得它更容易,但需要一段时间才能在较旧的项目上实施。

无论如何,你会发现很多网站都在讨论这个问题,一个好的开始是grant skinner's blog