Garbage Collection

GameMaker垃圾收集器之所以存在,是因为方法可以在堆栈上传递而不被引用,结构和其他一些东西也是如此,如果不以某种方式 "清理" 它们,反过来又会导致内存泄漏。这就是垃圾收集器的用武之地,它将在游戏后台运行,收集任何被取消引用的内容并保持最佳的内存使用率。当我们谈论被解引用的东西时,我们通常指任何与global变量或对象实例变量没有连接(不必直接连接,而是通过一系列其他变量)的结构或函数。另请注意,在 IDE 脚本中定义的函数也不会被收集,因为它们被隐式设置为全局函数。

注意 请注意,诸如表面、数据结构、缓冲区和其他动态资源之类的东西 不会 被垃圾收集,并且有自己的 销毁 函数来清理与他们相关的记忆。根据经验,如果您在运行时创建的任何内容具有 destroy 函数,那么它不会被垃圾回收,您必须自己在代码中处理它。序列、动画曲线和实例除外,它们也需要垃圾收集器, 但仍需要调用其销毁函数

GameMaker使用的垃圾回收是 "世代相传"。这意味着,为了减少每帧必须完成的工作,将对象划分为 "世代"。新对象是在第 0 代中创建的,随着它们自身的老化,它们会被移到较早的一代。总体思路是,暂停一段时间的对象不需要持续测试以查看是否应将其删除,但可以减少检查频率(请注意,这里的 "对象" 是指任何可以进行垃圾回收的对象,不是资源浏览器中定义的通用对象实例)。请注意,虽然检查系统是世代相传的,但实际检查是以 "增量" 的方式完成的,因此,与其在单帧中清除一代中可能存在的数千个物体(导致 CPU 使用率激增并可能影响游戏玩法),而是检查每一代对象,如果需要,清理将分散在多个帧上,这样垃圾收集器的运行频率就会更高,但每收集一帧的工作量就会减少(你可以为垃圾收集器设置目标时间)使用函数{在每帧上消费}gc_target_frame_time())。

一般来说,你永远不需要与GameMaker垃圾回收系统进行交互,通常它的操作结果是不可见的,但是有些 GML 命令可用于获取有关收集器正在做什么的信息,并在有限程度上影响其行为。

重要信息 在 HTML5 目标平台上,垃圾回收由 JavaScript 引擎处理,因此下面列出的函数都不会影响其操作,并且函数 gc_get_stats 将返回 0 所有领域。

 

为了帮助决定哪些需要收集垃圾,以及何时还有一些函数可以用来创建和检查对结构的弱引用。弱引用是一种不能保护被引用对象免受垃圾回收器收集的引用,因此可用于检查结构是否仍在 "活着"(被引用)或不在游戏中的某个地方。可用于弱引用的函数有: