版本:Unity 6 (6000.0)
语言:英语
优化
托管内存

Unity 中的内存

为了确保您的应用程序运行时没有性能问题,理解 Unity 如何使用和分配内存非常重要。本手册部分解释了 Unity 中的内存工作原理,旨在帮助希望了解如何提高其应用程序内存性能的读者。

Unity 使用三个内存管理层来处理应用程序中的内存

  • 托管内存:一个受控的内存层,使用托管堆和 垃圾收集器 自动分配和分配内存。
  • C# 非托管内存:一个您可以与 Unity Collections 命名空间和软件包结合使用的内存管理层。这种内存类型被称为“非托管”,因为它不使用 垃圾收集器 来管理未使用的内存部分。
  • 本机内存:Unity 用于运行引擎的 C++ 内存。在大多数情况下,此内存对 Unity 用户不可访问,但如果您想微调应用程序性能的某些方面,了解它很有用。

托管内存

Mono 和 IL2CPP 的 脚本虚拟机 (VM) 实现 **托管内存** 系统,有时被称为脚本内存系统。这些 VM 提供了一个受控的内存环境,分为以下不同类型

  • **托管堆**:VM 使用 垃圾收集器 (GC) 自动控制的内存部分。因此,分配在托管堆上的内存被称为 **GC 分配**。 性能分析器一个帮助您优化游戏的窗口。它显示了在游戏的各个区域花费了多少时间。例如,它可以报告渲染、动画或游戏逻辑中花费的时间百分比。 更多信息
    参见 词汇表
    记录了这种分配的任何出现,作为 **GC.Alloc** 样本。
  • **脚本堆栈:** 这是在应用程序进入和退出任何代码范围时建立和展开的。
  • **本机 VM 内存:** 包含与 Unity 的脚本层相关的内存。大多数情况下,您无需操作本机 VM 内存,但了解它包含与代码生成的执行代码相关的内存很有用,特别是围绕 泛型反射 使用的类型元数据以及运行 VM 所需的内存。

由于托管内存系统使用 VM,因此它具有一个受控的环境,该环境自动跟踪分配的引用以管理其生命周期。这意味着您的应用程序不太可能过早地释放内存,而其他代码正在尝试访问它。这也意味着您具有一些针对 内存泄漏 的保护措施,这些泄漏发生在内存无法从代码访问时或未使用的内存累积时。

在 Unity 中使用托管内存是管理应用程序中最简单的内存方法;但它也有一些缺点。垃圾收集器使用起来很方便,但它在释放和分配内存的方式上也很不可预测,这可能会导致性能问题,例如卡顿,当垃圾收集器必须停止释放和分配内存时就会发生这种情况。为了解决这种不可预测性,您可以使用 C# 非托管内存层

有关托管内存工作原理的更多信息,请参阅有关 托管内存 的部分。

C# 非托管内存

**C# 非托管内存层** 允许您访问本机内存层以微调内存分配,并提供编写 C# 代码的便利。

您可以使用 Unity 核心 API 中的 Unity.Collections 命名空间(包括 NativeArray),以及 Unity Collections 软件包 中的数据结构来访问 C# 非托管内存。如果您使用 Unity 的 C# Job 系统或 Burst,则必须使用 C# 非托管内存。有关这方面的更多信息,请参阅有关 Job 系统Burst 的文档。

本机内存

Unity 引擎的内部 C/C++ 核心拥有自己的内存管理系统,称为 **本机内存**。在大多数情况下,您无法直接访问或修改这种内存类型。

Unity 将项目中的 场景场景包含游戏环境和菜单。将每个唯一的场景文件视为一个唯一的关卡。在每个场景中,您可以放置环境、障碍物和装饰,本质上是分段设计和构建您的游戏。 更多信息
参见 词汇表
、资产、图形 API、图形驱动程序、子系统和 插件在 Unity 之外创建的一组代码,在 Unity 中创建功能。您可以在 Unity 中使用两种类型的插件:托管插件(使用 Visual Studio 等工具创建的托管 .NET 程序集)和本机插件(特定于平台的本机代码库)。 更多信息
参见 词汇表
缓冲区以及本机内存内部的分配,这意味着您可以通过 Unity 的 C# API 间接访问本机内存。这意味着您可以以安全且便捷的方式操作应用程序的数据,而不会失去 Unity 本机核心提供的本机和高性能代码的优势。

大多数情况下,您无需与 Unity 的本机内存进行交互,但您可以通过 性能分析器一个帮助您优化游戏的窗口。它显示了在游戏的各个区域花费了多少时间。例如,它可以报告渲染、动画或游戏逻辑中花费的时间百分比。 更多信息
参见 词汇表
中的 性能分析器标记放置在代码中以描述随后在 Unity 性能分析器窗口中显示的 CPU 或 GPU 事件。默认情况下添加到 Unity 代码中,或者您可以使用 ProfilerMarker API 添加自己的自定义标记。 更多信息
参见 词汇表
查看它如何影响应用程序的性能。您还可以通过更改 Unity 本机内存分配器的某些可配置设置来调整应用程序的性能。有关更多信息,请参阅有关 本机内存 的部分。

优化
托管内存