|
大家好,我叫Kalle Hämäläinen,是开发《海之号角2:失落王国的骑士》的资深程序员。在这篇博客文章中,我将会介绍一下我们怎样把这款游戏(它本来是针对Apple Arcade支持的所有设备开发的,从iPhone 6系列到最新的MacBook Pro都包括在内)移植到任天堂Switch的。
我们在着手工作时设定了下列目标:
- 保持尽可能高的画质水平。
- 实现稳定的帧率。
- 实现原生分辨率(TV模式下1080p,掌机模式下720p)。
- 通过动态分辨率使用超采样抗锯齿取代多重采样抗锯齿(用于iOS中)或临时抗锯齿(用于Mac)。
- 使用移动端渲染器取代PC渲染器,因为我们要优先确保分辨率,而不是渲染功能。
为了进行Switch移植,我们与工作室Engine Software进行了协作。总的来说,我们制定的目标对Switch硬件提出了很高要求,因为它配备的是三个时钟频率比较低的CPU核心。
第一次迭代
我们的第一次Switch迭代仅达到13帧/秒的运行速度。而在iOS上,我们开发时的目标是30帧/秒。当Apple Arcade首次公布时,我们还不清楚它支持的最老的设备是什么(后来知道是iPhone 6系列)。把目标定在30帧/秒能让我们保持很高的分辨率,而且最重要的是,电池的电量消耗不会太高。
解决方案
在30帧/秒的速度下,可以用33.3毫秒来渲染一帧画面,而我们初步得到的结果却很不幸,每帧需要近80毫秒。我们感到很困惑:这个游戏已经针对移动设备优化过了。我们忽略了什么?后来的事情表明,忽略了很多。新型的苹果移动设备拥有比Switch更强大的CPU——这使我们可以忽略许多资源没有得到高效利用的情况。于是我开始分析这款游戏并寻找答案。
主机游戏和移动端游戏的区别是,在移动平台上,性能会根据后台应用程序、电池电量和设备温度进行调整。而在主机上,如果游戏有稳定的性能,你就知道它会始终如一。
我开始进行优化,我的方法就是寻找所有运行缓慢的蓝图,把它们移植到C++。只用两天时间,我就把渲染时间从最初的结果削减了20毫秒。这些立竿见影的成果让我想到,肯定还有另一些可以轻松实现的优化是我们没有做的。其中一个很快就被我找了出来:一些关卡有超过5000个Actor——这个数字远远超过推荐的数量。虽然iOS设备处理这么多Actor不是什么大问题,但Switch版不经过大手术是做不到的。
我统计了每一帧中有多少Actor会发生更新,发现这个数字超过了1000。除此之外,还有近1500个会更新的组件。这就是我们要解决的问题。我们要做的第一件事就是减少每帧的更新数量。下面是我们的发现和节省渲染时间的方法:
- 有些Actor在更新中基本上没做什么。对于这类Actor,我们要么完全禁用更新,要么就显著延长更新间隔。
- 有些Actor会手动查询重叠。对这类Actor可以进行重构,使用重叠事件取代查询,而且仅在事件发生后暂时启用更新。
- 有些Actor执行的操作只和视觉效果有关,但是玩家却看不到。为了解决这个问题,我们使用了视锥体、距离、动态和静态遮蔽剔除,然后只更新可见的Actor。
- 有些Actor执行的操作从技术角度来说是可见的,但是距离太远,玩家不会注意到。例如,在白市,任何时候的角色总数都超过300个,但是在玩家周围通常只有10个左右——只有这些角色才是需要更新的。
虚幻引擎提供了一些方法来优化这些情况;但是,团队有责任做出明智的决策,有时候需要选择性使用或自定义代码。在这次移植中,我们添加和删除了一些代码,同时也使用了内置的优化;例如,我们使用了动画tickrate。
另一个拖慢速度的因素来自地形青草系统。这个系统会在地形上动态生成数以百万计的青草和其他植物网格体。我们发现它每帧要占用多达2.5毫秒。我们注意到,我们对不同地形图层使用不同类型植物的方法会生成许多空的批次。这个问题很好解决,只需要让组件的每个特定植物类型的权重为零时提前退出即可。这个系统还会更新来自地形的所有组件。为了解决这个问题,我们首先确定任何植物类型的最大距离是多少,然后只更新那些在此范围中的组件。我们把地形组件从4000个减少到了10个(在玩家身边的那些),从而使渲染时间缩短到0.1毫秒。如果你觉得这些优化会令你的项目受益,那么我们要高兴地告诉你,我们已经在GitHub上的最新虚幻引擎版本中提供了它们。
最后但同样值得注意的是,Engine Software实现了一种叫做Actor Tick Batching的技术,它曾被用于《盗贼之海》。Actor Tick Batching能减少指令缓存缺失并开启其他优化可能,例如减少重复工作或根据Actor距离执行更新速度优化。
这一切努力造就了经过高度优化的《海之号角2:失落王国的骑士》移植版,它将在2020年秋季登陆任天堂Switch。感谢阅读本文!
文/Kalle Hämäläinen
来源:虚幻引擎
原文:https://mp.weixin.qq.com/s/3lx3I3LFySDSkdm1fgqVxw
|
|