Unity 使用垃圾回收器来回收应用程序和 Unity 不再使用的对象的内存。当脚本尝试在托管堆上进行分配,但没有足够的空闲堆内存来容纳该分配时,Unity 会运行垃圾回收器。垃圾回收器运行时,它会检查堆中的所有对象,并标记应用程序不再引用的任何对象以供删除。然后,Unity 删除未引用的对象,从而释放内存。
垃圾回收器以相同的方式处理后续请求,直到没有足够大的空闲区域来分配所需的块大小。在这种情况下,不太可能所有分配的内存仍在使用。Unity 的脚本后端为 Unity 中的脚本提供支持的框架。Unity 根据目标平台支持三种不同的脚本后端:Mono、.NET 和 IL2CPP。但是,通用 Windows 平台仅支持两种:.NET 和 IL2CPP。更多信息
参见词汇表 只能访问堆上的引用项,只要仍然存在可以定位它的引用变量。如果所有指向内存块的引用都丢失(如果引用变量已被重新分配,或者如果它们是现在超出范围的局部变量),则垃圾回收器可以重新分配它占用的内存。
为了确定哪些堆块不再使用,垃圾回收器会搜索所有活动引用变量,并将它们引用的内存块标记为“活动”。搜索结束时,垃圾回收器会将“活动”块之间的任何空间视为为空,并将其标记为供后续分配使用。查找和释放未使用内存的过程称为垃圾回收(GC)。
注意:垃圾回收器在 Web 平台上的工作方式有所不同。有关更多信息,请参阅垃圾回收注意事项。
在 Unity 中,垃圾回收器具有以下模式
Unity 具有以下工具来跟踪内存分配
在 CPU 使用情况模块中,“层次结构视图”包含一个GC Alloc 列。此列显示 Unity 在特定帧中在托管堆上分配的字节数。它还显示垃圾回收器管理的内存量,并且包括 Unity 可能已分配并在后续帧中重复使用的内存。这意味着所有帧的 GC Alloc 总和并不等于托管内存在此期间增长的数量。
为了获得最准确的信息,您应该始终在目标平台或设备上针对开发版本开发版本包含调试符号并启用 Profiler。更多信息
参见词汇表 对应用程序进行分析。Unity 编辑器的工作方式与构建不同,这会影响分析数据;例如,GetComponent
方法在编辑器中执行时始终分配内存,但在构建的项目中则不会。
您还可以使用Profiler一个帮助您优化游戏的窗口。它显示在游戏的各个区域花费了多少时间。例如,它可以报告渲染、动画或游戏逻辑中花费的时间百分比。更多信息
参见词汇表中的调用堆栈模式来确定分配发生在哪个方法中。您可以为GC.Alloc 示例启用完整的调用堆栈跟踪,这将有助于您确定垃圾回收器在哪里以及何时运行。