代码之家  ›  专栏  ›  技术社区  ›  Glycerine

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

  •  2
  • Glycerine  · 技术社区  · 15 年前

    我已经建立了一个游戏一段时间(几乎完成)-但游戏需要一个重播按钮和它的一个大任务。

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

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

    任何转发的想法都很好。

    干杯。

    3 回复  |  直到 15 年前
        1
  •  2
  •   fenomas    15 年前

    我会这样做:

    1. 创建一个类来封装整个游戏,称为gamecontainer或其他什么。
    2. 对所有源代码进行搜索,并确保每次调用 addEventListener ,你通过了 true 对于“使用弱引用”参数。
    3. 在document类(或frame脚本)中,创建一个gamecontainer实例并将其添加到stage中,而不执行其他操作。

    现在,当你想完全清除内存中的游戏时,从stage中移除gamecontainer并清空引用。内存不会立即释放,但游戏中的所有内容现在都可以释放。如果flash认为它需要更多的内存,它将触发一个gc,并且大型的孤立游戏容器将被nuck。(上面的步骤2将使事件侦听器不被计算为对对象的引用,并确保所有自包含的对象都符合处理条件。

    不知道你说flash的gc是什么意思。我想不起来有没有听说过里面有虫子。它不会对你的对象进行核弹攻击,除非你对你的引用很小心,但是所有的垃圾收集都是这样。

        2
  •  1
  •   grapefrukt    15 年前

    不差刷新页面。你可以通过加载一个单独的swf然后卸载它来进行一些黑客攻击,但是这和正确的方法一样容易出错。

    我的建议是扣上安全带,写下重置功能,然后 something to monitor memory 并通过多次重新输入/重置来确保其正常工作。

        3
  •  0
  •   Matt D    15 年前

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

    仍然没有保证,但不幸的是,我相当肯定没有捷径可以强制释放内存。

    (对我来说,这也意味着要确保我的事件处理程序被正确地清除,并且对于我的外部swf加载程序,我的加载程序在传递了它们的内容之后会“unload()”。)