Actionscript 3 垃圾收集-手动擦除所有内容!

Actionscript 3 垃圾收集-手动擦除所有内容!,actionscript-3,memory-management,garbage-collection,Actionscript 3,Memory Management,Garbage Collection,我已经制作了一个游戏有一段时间了(几乎完成了)-但是游戏需要一个重播按钮,这是一项艰巨的任务 我知道flash中的GC非常糟糕,但我想知道是否有一种方法可以像flash应用程序刚刚开始一样擦除所有内容。清除内存,游戏数据-我不必担心游戏加载,因为它的数据量不是很重 几乎所有的东西都生活在一个数据模型中——但我担心如果我只清除所有变量,我会有一些孤立的内存 任何转发的想法都会很好 伙计们,干杯。这是一个令人耳目一新的页面。通过加载一个单独的swf,然后卸载它,可能会有一些黑客行为,但这和正确的方法

我已经制作了一个游戏有一段时间了(几乎完成了)-但是游戏需要一个重播按钮,这是一项艰巨的任务

我知道flash中的GC非常糟糕,但我想知道是否有一种方法可以像flash应用程序刚刚开始一样擦除所有内容。清除内存,游戏数据-我不必担心游戏加载,因为它的数据量不是很重

几乎所有的东西都生活在一个数据模型中——但我担心如果我只清除所有变量,我会有一些孤立的内存

任何转发的想法都会很好


伙计们,干杯。

这是一个令人耳目一新的页面。通过加载一个单独的swf,然后卸载它,可能会有一些黑客行为,但这和正确的方法一样容易出错

我的建议是,只需全力以赴写下你的重置函数,然后通过多次重新初始化/重置来确保它能正常工作

我会这样做:

  • 创建一个封装整个游戏的类,称为GameContainer或其他
  • 搜索所有源代码,并确保在每次调用
    addEventListener
    时,都传递了“使用弱引用”参数的
    true
  • 在您的文档类(或框架脚本)中,创建GameContainer的单个实例并将其添加到stage中,而不执行其他操作 现在,当您想完全清除游戏内存时,请从舞台上移除GameContainer并将引用设为空。内存不会立即释放,但游戏中的所有内容现在都可以释放。如果Flash认为它需要更多的内存,它将触发GC,并且大型孤立的游戏容器将被核化。(上面的步骤2将防止事件侦听器作为对对象的引用计数,并确保所有自包含对象都有资格进行处置


    不过,我不知道你说Flash的GC太可怕是什么意思。我记不起听说过里面有什么bug。除非你小心引用,否则它不会攻击你的对象,但所有垃圾收集都是如此。

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

    目前还不能保证,但不幸的是,我相当肯定没有强制释放内存的捷径


    (对我来说,这也意味着确保事件处理程序被正确清除,对于我的外部SWF加载器,我的加载器在传递内容后将“unload()”)

    你的回答当然非常正确。事实上,我只是希望有一些捷径。我很难确保所有内容都被删除。如果我切换回第1帧(我的预加载程序)我可以卸载我在第2帧上加载的所有东西吗?我的预加载程序通过在第2帧上加载所有东西来工作。这真是一个非常好的主意。在后台和Papervision中使用数据模型可以吗?-对于GC,我发现它在收集数据时有点任性,并且在获得GC'dIt al之前,应用程序可能会膨胀一点l依赖于内部引用。当您删除对任何给定对象的最后一个引用时,它会被释放,但如果有两个对象相互引用,即使您没有保留对这两个对象的任何“外部”引用,它们仍然有传入引用。这些引用直到GC(标记扫描)才会被释放发生,并且发生的时间取决于各种闪存内部。因此,一般来说,您应该监控内容的长期内存使用情况,而不必担心它是否会在您认为应该的时候跳转。所有垃圾收集语言都是这样工作的,如果要收集内存,您必须管理引用。谢谢fenomas。我无法做出明确的声明,因为我只熟悉Flash和Java,并且不确定是否有其他收集器可以在您解除引用时手动告诉您释放内存用于某些内容。感谢您的帮助说明/详细说明。