请在本文中了解什么是Unity的内存管理、如何识别内存占用的性能问题、哪些设置可以修复这些问题,以及它们的使用方法。
Unity有三层管理应用内存的机制:
Unity内部带有多种分配本地内存的工具,称作分配器(allocator)。本文将重点讨论其中的两个:
在向内存管理系统请求新内存时,我们首先会检查其大小。如果它小于一定体积,我们就向桶分配器索取内存。当桶分配器被填满,我们还有许多的内存仍然需要被分配,这些小的内存空间将由动态堆分配器提供。转为使用动态堆分配器会使存取速度减慢,且动态堆中存在的大量小内存片段会导致内存堆进一步碎片化。
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中发布。