相信大家对《奥日2:精灵与萤火意志》(以下简称《奥日2》)都不陌生,该作因极具风格的 2.5D 角色和唯美梦幻的环境而备受赞誉;GameSpot、Game Informer 和 PC Gamer都对其画面赞不绝口。

打开网易新闻 查看更多图片

该作基于 Unity 开发,同时支持 PC 和 Xbox One 两大平台。2020 年夏天,Unity 为 Moon 工作室提供了技术支持,帮助他们将《奥日2》移植到了 Nintendo Switch 上,接触到了更广泛的受众。

大家都知道,开发一款兼容各种硬件的游戏需要考虑许多问题,对内存数据的优化更是重中之重。

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

《奥日2》最大化利用了 Nintendo Switch 的内存。企业技术支持团队帮助 Moon 工作室取得了最理想的内存分配效果,尤其是在本地内存的分配上。

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

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

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

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

定制功能?

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

托管内存

C#非托管内存

本地内存

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

存储桶分配器(bucket allocator)会将体积相近的小内存划分成通用的内存块。它存取速度快、应用广泛,但它受硬编码的限制有固定的体积限制。

另一个动态堆分配器(dynamic heap allocator)则是一种更为通用的分配器,被用于存储绝大多数的本地内存。它的存取速度要比存储桶分配器慢,因为它可以处理多种内存管理的情形。

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

打开网易新闻 查看更多图片

从 2021 LTS 起,所有人都能为自己的游戏优化内存利用率。用户可以测量各个分配器分别占用了多少内存,然后根据需求来定制内存的大小。

如果您的项目需要更加深入的内存优化方案,欢迎体验 Unity 最新的性能综合分析平台 UPR。UPR 在 Profiler 的基础上,增加了更多的性能指标及功能,比如常用的资源检测及 Lua 性能分析。此外,基于 Web 的数据中心,提供了更强大的数据展示及对比功能,且同时对接性能报告解读服务。该平台是 Unity 在帮客户做优化时主要使用的工具。

UPR 官网:

https://upr.unity.cn

UPR 使用手册:

https://upr.unity.cn/instructions/instructions

Unity 官方微信

第一时间了解Unity引擎动向,学习最新开发技巧

每一个“在看”,都是我们前进的动力