优化Sonic Dream Team以在Apple Arcade设备上达到fps目标

Sonic Dream Team 是由 Hardlight 开发并由 SEGA 发布的平台游戏。该游戏是 Sonic the Hedgehog 系列的一部分,索尼克和他的朋友们在邪恶的蛋头博士扭曲的梦境中飞速前进,以阻止他对世界统治的追求。
Apple Arcade 要求工作室在所有支持的设备上达到相同的性能目标,这给团队带来了更大的压力,以优化游戏,使其在从 iPhone 6s Plus 到 iPhone 16 的所有设备上看起来都很出色。以下是他们如何在低端和高端设备上达到所需的帧率。
挑战:
在广泛的设备上创建高保真和高性能的游戏。
平台:
Apple Arcade(iOS、macOS、tvOS、iPadOS)
地点:
英国沃里克郡。
项目工作人员:
20 名艺术家,10 名工程师和 8 名设计师。
Sonic Dream Team:Unity 案例分析。
团队如何优化以在低端和高端设备上达到所需的帧率?
在与刺猬相处了10年后,Hardlight希望通过增强故事情节、涉及更多角色,并将动作和冒险风格与高保真视觉效果相结合,来迎接新的挑战——这些视觉效果在所有设备的全范围上看起来都很棒,Apple Arcade游戏可以在这些设备上玩。在朝着这些目标努力的过程中,团队遇到了与 CPU 和 GPU 相关的性能问题,这促使他们继续优化。

结果
在中高性能设备上将 CPU 帧时间从 52 毫秒减少到 16 毫秒。
将iOS上的构建大小从4 GB减半至2 GB
将着色器变体运行时内存从1 GB+减少到100 MB以下
解决渲染问题
为了分析性能,团队利用了Unity提供的各种分析工具,特别是Profiler、Frame Debugger和Memory Profiler。这些工具帮助团队更好地理解问题的来源,以在设备上达到30 fps和60 fps。
渲染占用了总帧时间预算的很大一部分,尤其是在低端设备上。团队依赖SRP批处理来帮助减少这部分成本。
“我们选择了通用渲染管线(URP),因为它现代的渲染方法以及Unity对其未来的持续支持,”Hardlight的技术艺术家Fraser Hutchison说。团队优先考虑SRP批处理和Shader Graph等功能,以便在移动设备上推动他们的视觉效果。“SRP批处理为我们做了很多繁重的工作,并给我们的艺术家提供了灵活性,不必像标准静态批处理那样担心材料限制,”Hutchison继续说道。“我们平均有100-200个批次,主要在不透明队列中,这效果很好。”

Sonic Dream Team | Hardlight | SEGA
团队还减少了反射探针,并使用材料排序队列和烘焙光照来提高批处理效率并降低渲染成本。
由于关卡的大小,他们实现了一个自定义的分层体积剔除系统,以减少渲染开销。“每个关卡被分成大块,我们称之为‘岛’,根据玩家的位置启用或禁用,”Hutchison说。“这也意味着我们可以禁用这些岛屿的动画器和粒子效果。总体而言,这是一个轻量级的解决方案,满足了我们的需求。”

Sonic Dream Team | Hardlight | SEGA
“团队的艺术家希望拥有高保真图形,包含大量独特的网格数据、着色器效果和后期处理,以帮助推动他们所创造的世界的梦幻品质。有了URP,内置的后期处理功能意味着我们可以快速模拟视觉效果,而不总是需要完全自定义的解决方案。” – Hardlight艺术总监Simon Dew
减少CPU帧时间
为了确保所有iOS设备上的游戏体验一致,Hardlight团队将其物理频率设置为60 Hz,而不是默认的50 Hz。他们使用FixedUpdate来强制特定对象更新之间的预期时间步,以增强确定性。
当由于性能问题帧时间显著增加时,Unity中会在单个帧内进行多次FixedUpdate调用,以保持所需的物理更新速率。
“最终,模拟无法及时处理所有所需的更新,导致帧时间更长,”Hardlight的首席软件工程师路易斯·马坎说。相同的物理时间步导致低端设备上每帧FixedUpdate调用的数量增加,这些设备以30 fps运行游戏。

Sonic Dream Team | Hardlight | SEGA
为了在像iPhone 6s Plus这样的旧设备上保持良好的帧率,团队优化了每个FixedUpdate。在分析单个FixedUpdate调用时,他们注意到绝大多数FixedUpdate时间被数百个脚本实例的更新调用占用。尽管这些脚本通过早期退出条件迅速退出,但FixedUpdate调用仍然执行。
“即使看起来FixedUpdate在条件不满足时没有做任何事情,脚本中声明的每个Unity事件函数都会造成开销,”马坎说。“虽然开销本身很小,但在关卡创建期间执行的数千个Update、FixedUpdate和Late Update调用对性能产生了很大影响。”
解决这个问题需要多种方法的结合。首先,为脚本添加了一个管理器,以便它们可以注册自己,管理器会按所需的更新频率逐个处理每个对象。这意味着所有Unity事件函数都可以被移除,不再占用CPU时间。最后,未与玩家物理交互的对象被设置为在Update中处理,从而将低端设备的计算成本减半。

Sonic Dream Team | Hardlight | SEGA
增强游戏的粒子系统
团队还注意到场景中过多的粒子系统影响了CPU性能。作为粒子池系统的一部分,团队通过自定义的ParticleEffectsWrapper组件使用ParticleSystemRenderer API启用或禁用粒子系统。在主线程和工作线程上处理超过500个粒子系统更新,这大约占用了5.2毫秒的CPU帧时间。
“Unity的视觉效果图在这个项目中对我们来说不是一个选项,因为我们许多低端设备不支持该系统所依赖的GPU计算,”Hutchison说。“如果我们能使用它,我们将从其更好的剔除和实例化技术中受益。”
Unity中的粒子系统可以是程序化的或非程序化的。程序化粒子系统可以自由地倒回或快进到任何时刻。
“通过程序化,Unity可以安全地剔除粒子系统及其所有相关处理,当它在屏幕外时,然后在再次可见时简单地快进到正确的状态,”Hutchison说。“这可以产生相当可观的性能提升。然而,这通常是粒子效果创建中被忽视的一部分,并且很容易意外地使效果变为非程序化。”

Sonic Dream Team | Hardlight | SEGA
为了避免这种情况,ParticleEffectsWrapper组件不仅根据相机视锥剔除粒子,还定义了自定义渲染边界,因此即使一个粒子被标记为程序化,手动设置的边界仍然可以剔除系统。
“在一个场景中有大量粒子系统时,确保尽可能多的系统是程序化的变得很重要,如果不是,则在ParticleEffectsWrapper组件中设置它们的渲染边界,”Macan说。“这防止了不必要的计算和绘制调用,显著提高了性能。”
除了剔除,团队还优先考虑效果的良好创建实践。他们只使用必要的粒子系统,并限制最大粒子数以减少alpha过度绘制和内存分配。他们还专注于处理粒子效果的纹理图集,并避免过长的持续时间。他们还通过URP渲染设置中的‘显示所有隐藏属性’切换启用了动态批处理,这一小改动帮助他们减少了粒子的绘制调用并加快了渲染速度。

Sonic Dream Team | Hardlight | SEGA
遇到GPU瓶颈
Sonic Dream Team的愿景需要先进的图形和快速的游戏玩法。为了定制,他们为某些效果使用了渲染特性,如屏幕空间环境光遮蔽、自定义全屏效果和屏幕空间贴花。这造成了渲染延迟和内存问题。
“在开发过程中,我们发现使用基于深度的屏幕空间贴花来处理角色和敌人阴影时,渲染特性导致了不必要的深度法线预处理,”Hutchison说。“这意味着渲染时间的大部分都花在了不必要的工作上,并增加了渲染目标内存,因为我们不需要法线缓冲区。我们与Unity团队合作解决了这个问题,修复程序已在引擎补丁发布中添加。”

Sonic Dream Team | Hardlight | SEGA
着色器预热也是一个问题,整个关卡中CPU/GPU的显著峰值导致了卡顿。“为了有效地在Metal上预热着色器,着色器必须包含所有所需的关键字,并具有它们将渲染的每个网格的特定顶点布局组。这意味着仅限编辑器的缓存是不可能的,”Hutchison说。
为了解决这个问题,Hardlight的工程师创建了一个系统,在加载时“闪烁渲染”相机前的所有对象,位于加载屏幕后。
“我们的岛屿剔除技术提供了对场景中所有渲染器列表的轻松访问。在设备上执行这项操作意味着我们在玩家正式进入关卡之前,拥有所有正确的管道状态数据和质量设置中的关键字,”Hutchison说。“这确实稍微增加了关卡加载时间,但对于玩家体验来说是值得的。”
虽然对克服着色器预热的结果感到满意,Hutchison正在考虑未来的其他选择。“自游戏发布以来,Unity发布了PSO缓存和通过GraphicStateCollections预热,我们希望在未来使用它。”

Sonic Dream Team | Hardlight | SEGA
通过Addressables减少内存大小
在开发过程中,游戏在运行时使用了1.35 GB的内存。考虑到iPhone 6s Plus只有2 GB的物理内存,这可能导致问题,包括操作系统终止应用程序的风险。
“资产重复是一个大障碍。”这款游戏有超过3000个重复的素材资源,这使得其体积膨胀,并导致在运行时多次加载相同的素材资源,"Macan说。
当时,Unity可寻址系统仅管理游戏素材资源的一小部分。这导致了素材资源在二进制文件和可寻址组中都被引用,从而造成了重复。
在开发初期,团队使用了一个可寻址组,并将其设置为单独打包。这意味着组中的每个素材资源都有自己的单独AssetBundle。虽然在特定情况下很有用,但这种细粒度的方法也导致了大量重复的素材资源。确保所有资产都是可寻址的,并对可寻址组采取结构化的方法,使iOS上的构建大小从4GB减半至2GB。

Sonic Dream Team | Hardlight | SEGA
减少着色器变体内存
在游戏制作过程中,着色器变体是团队关注的一个重要领域,运行时着色器内存膨胀到超过1GB。变体的数量也增加了构建时间。他们通过各种方法解决了这个问题——主要是使用IPreprocessShaders进行着色器剥离、Unity的预过滤、Unity的动态着色器加载以及减少着色器分支。
“我们使用了自己定制的IPreprocessShaders剥离实现,全球性地从所有着色器中移除了着色器关键字,并通过Unity Asset Store的着色器控制进行了局部处理,”Hutchison说。“在着色器中更有意识地使用关键字也是一个很大的胜利。”
他们的着色器使用了Shader Graph,这本质上包括了Unity预定义的关键字,向这些添加额外的关键字会产生指数级的影响。将一些逻辑切换到动态分支或完全移除关键字显著减少了总变体。
“通过结合所有这些方法,我们将运行时着色器变体内存减少到平均100MB或更少,”Hutchison说。“我们还使用了Unity的项目审计工具,它提供了构建中所有资产和设置的全局视图。将其与内存分析器结合使用,我们识别出了受益于改进导入预设的纹理和网格。这进一步减少了来自艺术和音频资产的内存压力。”

Sonic Dream Team | Hardlight | SEGA
庆祝胜利并展望未来
在十多年中,Unity和Hardlight建立了一层共享技术,工作室依赖于此。“我们仍在支持10年前用Unity制作的游戏,”Macan说。
他指出,Unity多年来增加了很多功能,以至于工作室通过放弃一些Unity API的本机代码来简化其维护。“Unity 处理了许多低级设备支持,我们可以专注于制作实际的游戏。随着技术的发展,我相信 Unity 会帮助我们跟上,”他兴奋地说。
Sonic Dream Team证明你仍然可以教一只老刺猬新把戏。而且,就像索尼克一样,Hardlight和Unity都有着良好的业绩记录和光明的未来。
立即下载 Unity Pro
借助强大的工具、支持、经过验证的合作伙伴和充满活力的社区,开始制作出品质和影响力都比肩乃至赶超大型工作室游戏大作的游戏。