版本:Unity 6 (6000.0)
语言 : 英语
增量式垃圾回收
垃圾回收最佳实践

禁用垃圾回收

您可以使用 GarbageCollector.GCMode 在运行时禁用垃圾回收。这可以防止 CPU 出现峰值,但您的应用程序的内存使用量永远不会减少,因为垃圾回收器不会回收不再有任何引用的对象。

警告:禁用垃圾回收器需要仔细的内存管理。如果您没有仔细管理内存,托管堆会不断扩展,直到您的应用程序耗尽内存,操作系统将其关闭。

您可以使用以下 API 来微调对自动垃圾回收器的控制

  • System.GC.Collect:执行完全的阻塞式垃圾回收。
  • GarbageCollector.Mode.Disabled:完全禁用垃圾回收器。在此模式下使用 System.Gc.Collect 不会有任何效果。
  • GarbageCollector.Mode.Manual:禁用自动调用垃圾回收器,但您仍然可以使用 System.GC.Collect 来运行完全回收。
  • GarbageCollection.CollectIncremental增量式运行垃圾回收器。

您应该只在应用程序的性能关键的短时间段内禁用垃圾回收,当您能够计算和控制需要分配多少内存时。您应该立即在之后启用垃圾回收器,并经常分析您的项目,以确保您不会触发额外的托管分配,这可能会导致托管堆变得太大。

当您禁用垃圾回收器时,它不会停止您的应用程序执行垃圾回收。调用 System.GC.Collect 不会有任何效果,也不会启动回收。为了避免随着时间的推移内存使用量增加,您在管理内存时必须小心。理想情况下,您应该在禁用垃圾回收器之前分配所有内存,并在禁用垃圾回收器时避免额外的分配。

最佳实践是仅对长期存在的分配禁用垃圾回收器。例如,您可能希望在游戏级别加载之前为其分配所有所需的内存,然后禁用垃圾回收器以避免在级别期间的性能开销。在级别完成并且所有内存释放后,您就可以再次启用垃圾回收器并使用 System.GC.Collect 来回收内存,然后再加载下一个级别。

有关如何在运行时启用和禁用垃圾回收的更多详细信息,请参阅 GarbageCollector 脚本 API 页面。

增量式垃圾回收
垃圾回收最佳实践