Flash CS3-如何清理内存

| 我有一个问题,如何清除/释放闪存中的内存?例如,我正在完成游戏,我想从头开始,如果我只是跳到第一帧,则该内存中仍然有所有对象,是否有可能强制清理内存? 我可以释放对象的内存吗?例如我removeChild(something)-我想为一个对象释放内存,因为我将重用它? 谁能解释一下发动机的工作原理? 谢谢     
已邀请:
我鼓励您阅读\“ Moock Book \”(O \'Reilly Publishing的Essential ActionScript 3.0)中的第14章,垃圾回收。 对于您的问题的简短回答是,垃圾回收器不受垃圾回收器的控制。在像AS3或Java这样的垃圾收集语言中,您没有像较低级语言中那样手动控制内存的分配和取消分配。没有与AS3等价的东西,例如C ++中的delete或C语言中的free。您的目标不应控制销毁对象的时间,而应忘记删除对不再需要的对象的引用并确保禁用想要的对象用于垃圾收集。 AS3中的内存泄漏通常是由于新手误解(例如认为removeChild或设置对null的引用会破坏对象),以及不对对象的引用保持良好的跟踪而造成的,尤其是在涉及强大的侦听器的情况下。 先前的受访者这样写道:
myObject = null;
这样做是删除对变量myObject持有的对象的引用。而已。您需要对情况有更多的了解,以便能够说出这种分配是否甚至使有问题的对象有资格进行垃圾回收,尤其是还有多少其他变量持有对该对象的引用。即使您未将引用设置为null(即,如果myObject与GC根没有连接),该对象也可能已经可以进行垃圾回收了。 可以说,整个GC机制比StackOverflow帖子中可以令人满意地解释的更为复杂。这就是为什么它在Moock书中有一整章的原因,甚至连该书都没有涉及实现细节,也没有涉及Flash Player何时准确地对其删除计数或标记和清除遍历进行引用的细节。 谨记最重要的事情是恕我直言: 当您打算“杀死”一个对象时,请给它一个cleanUp()或destroy()函数,在其中执行诸如停止其所有计时器,声音,删除监听器之类的操作。一个对象将继续存在并执行代码,直到它会得到GC \ d。 Flash Player会尽可能延缓GC –通常是在Player需要从系统分配更多RAM时触发的,因为分配内存是唯一比做标记更耗时的事情并扫描GC通过。 了解弱听者与强听者的关系。基本上,当侦听器弱时,侦听器引用将被标记扫掠GC忽略,因此仅凭它并不能防止收集对象。但是,请勿听任何人告诉您“始终使用弱听者”或“始终使用强听者并手动将其删除”,因为有时每个听者都合适,所以这就是您的选择。     
removeChild()
将从舞台上删除对象,但仍将其保留在内存中。如果您想完全摆脱它,则必须像这样的对象“ѭ3”ѭ2。您可能不需要这样做。在大多数情况下,仅将其从舞台上删除并删除所有相关事件就足够了。     
使用Flash清除内存是一件棘手的事情,实现它的正确方法是在开始播放时正确设置对象,以方便清除,而不是强制删除。当您想从内存中删除一个对象时,可以通过删除对该对象的任何引用来完成它,然后闪存将其标记为垃圾回收。然后在稍后的Flash中将对象从内存中删除。 为了使对象准备好进行数据收集,它不能与另一个对象建立任何连接。 因此,如果您有一个与MovieClip具有单个连接的对象,并且该影片剪辑没有其他关系,那么如果将其设置为null,则将其删除。 但是,如果有两个指向它的对象,如果将一个链接设置为null来删除一个链接,则不会删除MovieClip。 此外,如果您有2个或更多具有连接网络的影片剪辑,则删除这些对象需要将这些连接也断开。例如,如果您的关卡中设置了许多角色并设置了侦听器,则删除lavel movieClip不会将其清除。 断开这些连接的一种方法是添加onRemovedFromStage事件,该事件将删除其他子级,侦听器和对象。我已经开始使用movieclip的casaLib扩展程序-CasaMovieClip,它具有一个名为removeChildrenAndDestroy的功能。这使它变得容易一些,但是要花一些时间才能在较旧的项目上实施。 无论如何,您会发现有很多讨论此问题的站点,一个不错的起点是授予skinner的博客     

要回复问题请先登录注册