Unity3D:增量垃圾回收

Unity3D:增量垃圾回收
推荐:将NSDT场景编辑器加入你的3D工具链
3D工具集:NSDT简石数字孪生

增量垃圾回收

增量垃圾回收(GC)将垃圾回收过程分散到多个帧上。这是 Unity 中的默认垃圾回收行为。

要启用增量垃圾回收,请打开播放器设置并启用使用增量 GC。默认情况下启用此功能。
要启用增量垃圾回收,请打开播放器设置并启用使用增量 GC。默认情况下启用此功能。

Unity 的垃圾收集器使用 Boehm-Demers-Weiser 垃圾收集器。默认情况下,Unity 在增量模式下使用它,这意味着垃圾回收器将其工作负载拆分到多个帧上,而不是停止主 CPU 线程(停止世界垃圾回收)来处理托管堆上的所有对象。这意味着 Unity 会缩短应用程序执行的中断时间,而不是让垃圾回收器处理托管堆上的对象的长时间中断。

增量模式总体上不会加快垃圾回收速度,但由于它将工作负载分布在多个帧上,因此减少了与 GC 相关的性能峰值。这些中断称为 GC 峰值,因为它们在 Profiler 窗口的帧时间图中显示为大峰值。

如果禁用增量模式(菜单:“>播放器编辑>项目设置”>“其他设置”>“配置”>“使用增量 GC”),则垃圾回收器在执行收集传递时必须检查整个堆。这称为停止世界垃圾回收,因为每当垃圾回收器运行时,它都会停止主 CPU 线程。它仅在处理了托管堆上的所有对象后恢复执行,这可能会导致 GC 峰值影响应用程序的性能。垃圾回收器也是非压缩的,这意味着 Unity 不会重新分发内存中的任何对象来缩小对象之间的间隙。

重要:WebGL 平台不支持增量垃圾回收。

禁用增量垃圾回收后,Unity 停止运行程序代码以执行垃圾回收时会出现 GC 峰值。此延迟可能会持续数百毫秒,具体取决于垃圾回收器需要处理的分配数以及运行应用程序的平台。

这对于实时应用程序(如游戏)来说是有问题的,因为当垃圾回收器暂停应用程序的执行时,应用程序很难维持平滑动画所需的一致帧速率。

增量垃圾回收示例

来自探查器的以下屏幕截图说明了增量垃圾回收如何减少帧速率问题:

启用了增量 GC 的性能分析会话
启用了增量 GC 的性能分析会话
禁用增量 GC 的性能分析会话
禁用增量 GC 的性能分析会话

在顶部性能分析会话中,启用了增量 GC。该应用程序具有一致的 60fps 帧速率,因为垃圾回收器将垃圾回收操作分布在多个帧上,并使用每个帧的小时间片(黄色 VSync 迹线正上方的深绿色边缘)。

底部分析会话已禁用增量 GC,并且有一个明显的 GC 峰值可见。此峰值会中断原本平滑的 60fps 帧速率,并将发生垃圾回收的帧推超过保持 60fps 所需的 16 毫秒限制。

如果您的应用程序使用 VSync 或 Application.targetFrameRate,Unity 会根据剩余的可用帧时间来调整分配给垃圾回收的时间。这样,Unity 可以在等待的时间内运行垃圾回收,并且可以在对性能影响最小的情况下执行垃圾回收。

注意:如果将“VSync 计数”设置为“不同步”以外的任何值(在项目的“质量”设置中或使用 Application.VSync 属性),或者启用了“Application.targetFrameRate ”属性,Unity 会自动使用给定帧末尾剩余的任何空闲时间进行增量垃圾回收。

若要更精确地控制增量垃圾回收行为,可以使用 Scripting.GarbageCollector 类。例如,如果您不想使用 VSync 或目标帧速率,则可以自行计算帧结束前的可用时间量,并将该时间提供给垃圾回收器使用。

禁用增量垃圾回收

增量垃圾回收可能会对应用程序造成问题,因为当垃圾回收器在此模式下划分其工作时,它也会划分标记阶段。标记阶段是垃圾回收器扫描所有托管对象以确定哪些对象仍在使用以及可以清理哪些对象的阶段。

当对象之间的大多数引用在工作切片之间没有更改时,划分标记阶段效果很好。但是,当对象引用更改时,垃圾回收器必须在下一次迭代中再次扫描这些对象。这意味着过多的更改可能会使增量垃圾回收器不堪重负,并造成标记阶段永远不会完成的情况,因为它总是有更多的工作要做。如果发生这种情况,垃圾回收器将回退到执行完整的非增量收集。

当 Unity 使用增量垃圾回收时,它会生成额外的代码(称为写入屏障),以便在引用更改时通知垃圾回收器,以便它知道是否需要重新扫描对象。这在更改引用时会增加一些开销,这在托管代码中会影响性能。

要禁用增量垃圾回收,请打开“播放器设置”窗口(>“播放器>配置”编辑>项目设置)并禁用“使用增量 GC”。大多数 Unity 项目都受益于增量垃圾回收,尤其是在它们遇到垃圾回收峰值时,但您应始终使用性能分析器来验证应用程序是否按预期执行。

此文由3D建模学习工作室整理翻译,转载请注明出处!

上一篇:Unity3D:内存分配器定制 (mvrlink.com)

下一篇:Unity3D:禁用垃圾回收 (mvrlink.com)

NSDT场景编辑器 | NSDT 数字孪生 | GLTF在线编辑器 | 3D模型在线转换 | UnrealSynth虚幻合成数据生成器 | 3D模型自动纹理化工具
2023 power by nsdt©鄂ICP备2023000829号