搜索 Unity

用Unity 2021 LTS定制内存占用

2022年4月20日 类别 技术 | 6 分 阅读
In-editor game footage with a giant frog
In-editor game footage with a giant frog
涵盖的主题
分享

为游戏工作室的大型项目优化引擎是我们最优先的任务之一。为此,我们在Unity 2021 LTS里推出了自定义内存分配的功能。

请在本文中了解什么是Unity的内存管理、如何识别内存占用的性能问题、哪些设置可以修复这些问题,以及它们的使用方法。

什么是内存分配器(Memory Allocator)定制?

Unity有三层管理应用内存的机制:

  • 托管内存
  • C#非托管内存
  • 本地内存

Unity内部带有多种分配本地内存的工具,称作分配器(allocator)。本文将重点讨论其中的两个:

  • 桶分配器(bucket allocator)会将体积相近的小内存划分成通用的内存块。它存取速度快、应用广泛,但它受硬编码的限制有固定的体积限制。
  • 另一个动态堆分配器(dynamic heap allocator)则是一种更为通用的分配器,被用于存储绝大多数的本地内存。它的存取速度要比桶分配器慢,因为它可以处理多种内存管理的情形。

在向内存管理系统请求新内存时,我们首先会检查其大小。如果它小于一定体积,我们就向桶分配器索取内存。当桶分配器被填满,我们还有许多的内存仍然需要被分配,这些小的内存空间将由动态堆分配器提供。转为使用动态堆分配器会使存取速度减慢,且动态堆中存在的大量小内存片段会导致内存堆进一步碎片化。

自定义内存帮助游戏《奥日》成功登陆Nintendo Switch

2020年夏天,Unity为Moon工作室提供了技术支持,帮助他们将《奥日与萤火意志》移植到了Nintendo Switch上。关于我们如何合作、怎样针对目标平台进行扩展的详情,可以在这个案例研究中了解。

Moon工作室和Unity Accelerate Solutions(原Unity Professional Services)团队一起分析了游戏代码,并通过调整粒子系统降低了内存占用。“如果你想在Nintendo Switch上以60帧流畅运行,那游戏的方方面面都需要经过优化,这其中包括游戏的模拟、流传输、渲染和图形,”工作室创始人Gennadiy Korol说。

《奥日与萤火意志》最大化利用了Nintendo Switch的内存。Accelerate Solutions团队帮助Moon工作室取得了最理想的内存分配效果,尤其是在本地内存的分配上。 

在与工作室合作期间,Unity团队测量了各种分配器所产生的内存数。他们还查看了每种分配器划分的内存量,并发现游戏在开始前就已经填满了部分桶内存。  

适当地增加内存桶的数量,可以为游戏期间分配的小内存提供额外空间。将这些小块内存分配到桶分配器中有效地提升了游戏的性能,并达到60帧的目标。小型内存不再由动态堆分配器进行分配,因此该分配器可以专注于处理大型内存块。这时,分配器的碎片化程度较低,而游戏也能更长时间地流畅运行。  

在与Moon工作室合作之后,Accelerate Solutions团队又与Optimization团队合作开发了内存分配器的定制功能,并在2021 LTS中发布。

立即开始平衡内存设置

在2021 LTS之前,Unity用户并不能自行平衡内存设置,而现在所有人都能为自己的游戏优化内存利用率。你可以测量各个分配器分别占用了多少内存,然后根据需求来定制内存的大小。请在这里查看功能的文档,并告诉我们它到底怎么样,我们期待了解你的使用体验。请加入Unity论坛与我们分享你的性能分析成果、做出的改进和一路上的挑战。

2022年4月20日 类别 技术 | 6 分 阅读
涵盖的主题
相关文章