垃圾收集 - 手动擦除一切!

时间:2010-04-09 09:03:53

标签: actionscript-3 memory-management garbage-collection

我已经建立了一段时间的游戏(差不多完成了) - 但游戏需要一个重播按钮,这是一项重大任务。

我知道GC在flash中是可怕的,但我想知道是否有办法擦除所有内容,就好像Flash应用程序刚刚开始一样。清除内存,游戏数据 - 我不必担心游戏加载,因为它对数据的影响不大。

一切都存在于DataModel中 - 但我担心如果我只清除所有变量,我就会有一些孤立的内存。

任何转发的想法都会很棒。

欢呼你们。

3 个答案:

答案 0 :(得分:2)

我会这样做:

  1. 制作一个封装整个游戏的类,名为GameContainer或其他。
  2. 搜索所有源代码,并确保在每次调用addEventListener时,您都在传递true“使用弱引用”参数。
  3. 在您的文档类(或框架脚本)中,创建一个GameContainer实例并将其添加到舞台上,而不执行任何其他操作。
  4. 现在,当您想要从内存中完全清除游戏时,请从舞台中删除GameContainer并将引用置空。内存不会立即发布,但游戏中的所有内容现在都有资格发布。如果Flash认为它需要更多内存,它将触发GC,并且大型孤立的GameContainer将被破坏。 (上面的步骤2将使您的事件侦听器不再被视为对象的引用,并确保所有自包含对象都有资格处置。

    不确定你对Flash的GC的意思是多么可怕。我记不起听说过它的任何错误。除非你小心你的引用,否则它不会对你的对象进行核对,但对于所有垃圾收集都是如此。

答案 1 :(得分:1)

不缺少刷新页面。你可以通过加载一个单独的swf然后卸载它来做一些黑客攻击,但这样做会像正确的方式那样容易出错。

我的建议是只需按下并编写你的重置函数然后得到something to monitor memory并确保它通过重新启动/重置多次来工作。

答案 2 :(得分:0)

Flash的垃圾收集器的问题是,据我所知,你不能强迫它“收集”。我在一个程序中遇到了这个问题,我将在其中加载各种外部SWF,偶尔Flash也不会加载它们。您可能需要做的是创建一个函数,在游戏结束时将代码中的每个主要变量设置为null,如果您想要真正的重置。

仍然无法保证,但不幸的是我很确定没有强制释放内存的捷径。

(对我而言,这也意味着确保我的事件处理程序被正确清除,并且在我的外部SWF加载程序的情况下,我的加载器会在关闭内容后“卸载()”。)