为了确保您的应用程序运行时没有性能问题,理解 Unity 如何使用和分配内存非常重要。本手册部分解释了 Unity 中的内存工作原理,旨在帮助希望了解如何提高其应用程序内存性能的读者。
Unity 使用三个内存管理层来处理应用程序中的内存
Mono 和 IL2CPP 的 脚本虚拟机 (VM) 实现 **托管内存** 系统,有时被称为脚本内存系统。这些 VM 提供了一个受控的内存环境,分为以下不同类型
由于托管内存系统使用 VM,因此它具有一个受控的环境,该环境自动跟踪分配的引用以管理其生命周期。这意味着您的应用程序不太可能过早地释放内存,而其他代码正在尝试访问它。这也意味着您具有一些针对 内存泄漏 的保护措施,这些泄漏发生在内存无法从代码访问时或未使用的内存累积时。
在 Unity 中使用托管内存是管理应用程序中最简单的内存方法;但它也有一些缺点。垃圾收集器使用起来很方便,但它在释放和分配内存的方式上也很不可预测,这可能会导致性能问题,例如卡顿,当垃圾收集器必须停止释放和分配内存时就会发生这种情况。为了解决这种不可预测性,您可以使用 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 本机内存分配器的某些可配置设置来调整应用程序的性能。有关更多信息,请参阅有关 本机内存 的部分。