Unity 技术开放日 | 太空科幻SLG手游的渲染与优化(上篇)
Unity官方 / 2021年6月17日
在 Unity 技术开放日-北京站活动中,我们有幸邀请到壳木游戏为大家介绍 SLG 手游的优化策略。壳木 CTO 邝圣凯和壳木技术平台主管陈石以《Infinite Galaxy》为例,详细介绍了太空 SLG 游戏的优化思路和细节。
本文节选了部分精彩内容,完整录播已上传至 B 站。
邝圣凯:大家好,感谢 Unity 的邀请,让我们壳木游戏有机会跟大家分享一下我们在 SLG 手游开发里面的一个经验。
我会先大概介绍一下联网 SLG 游戏及一般优化策略,再结合《Infinite Galaxy》进行详细介绍。然后我们的技术专家陈石会介绍具体的优化策略,包括阴影、体积光、面部捕捉等等。
SLG 游戏大家都很熟悉了,它是模拟、策略、群体对抗的游戏形式,前期个人养成,中后期以联盟+多人对抗的游戏方式,包括探索、扩张、采集、资源竞争等等。
先来看一下个人养成的部分,首先是基地,基地的部分有很多种包装形式,城堡、城市、基地、控制室等等,负责前期个人养成的部分,主要是单机项资源建设、资源生产。现在很多 SLG 项目为了吸引前期的泛用户,也会在前期加入单机的玩法来进行包装。
接下来是世界地图的场景,这是 SLG 游戏的核心场景。在这个上帝视角的地图中,有玩家基地、联盟领地、资源点、特殊建筑、事件等等,供玩家进行多人对抗。上面主要的动态元素就是“行军队列”,很多军队在上面远征、战斗,这是我们游戏战斗实时的截图。
有些 SLG 游戏还提供高层世界地图视角,主要为了高层次的快速浏览跳转,有些游戏还有引入拓扑的结构逻辑。
我们先来分析基地这个场景。
基地是养成的功能入口,以中远景为主,里面的对象是静态的,建筑、地标、功能对象等等,功能对象有可能数量比较多,这是我们需要注意的一点。
基地场景汇总还会有辅助性动态对象,这样能让场景不那么死板,总体而言这个场景不会有太重的计算逻辑或者动态渲染的需求。
接下来是策略宏观视角,这里是以总体的氛围为主来提升游戏画面表现,因为镜头的角度比较固定的,所以我们可以用一些比较取巧的方式,比如用 2D 方式模拟 3D 的光影效果等等。动静结合时要注意配比平衡,避免动态内容太多造成性能负载。如堆叠数量较多的建造类对象,包括对应的 UI 都是性能上需要注意的坑。
世界地图是我们游戏表现需要优化的一个核心场景,也是以远景为主,伴有静态动态的对象。这里的瓶颈是,在集中地域内短时间内爆发的行军战斗,还有一个玩儿到后期联盟的玩家倾向于聚焦在比较集中的地域,因此基地的渲染也会成为一个瓶颈。
我们对应这部分的策略,首先是进行多层 LOD 的优化,因为涉及到镜头推进拉远。拉远时候是很大尺度,有很多细节的表现,所以我们需要做一个非常大的模型方面的简化(后面会详细介绍)。
包括带有地表的地图可以考虑 GPU 做地表的快速构建,装饰对象用一些优化。
行军队列,首先控制队列里面兵种数量,目的促进小对象进行合批。合批的话,对应的动画方案也要考虑,一种是用 2D 序列帧,把 3D 的内容渲染为 2D 的序列帧,做序列帧对话促进合批。还有一种需要 3D 的表现,有一些视角微变化。这个时候考虑把 3D 动画烘成固定的mesh序列,针对简单的原理做队列的显示效果,这个本身的合批效果还是不错的。
基于同屏队列数量多的时候,我们会考虑在数量特别大,一个屏幕里面有几十个玩家在行军战斗的时候,我们可以偷偷地做数量上面的裁减,把数量降低,比如兵少渲染几个,这个时候玩家是觉察不出来的。
最后结合到硬件的并行发展,我们也可以考虑用多核对一些天然适合并行计算的队列移动等等的 case 进行优化,利用到 Unity 最新的 Job System。
接下来介绍一下《Infinite Galaxy》(以下简称IG)。这是一款太空科幻题材的 3D SLG 手游,写实风格的。因为立项比较早,早期是基于 built-in 管线构建的,2019 年下半年转成了 URP。转成 URP 一方面是官方推荐,我们也做了些功课,感觉这是未来的趋势。用过之后发现它确实有很多优点,可以在手游上做之前做不到的后处理,同时能够满足功耗支撑游戏正常进行。
IG 的主要场景包装跟 SLG 游戏是一致的,也是三个结构,基地对应控制室概念,里面的元素比较固定,比较好控制;世界地图分两层,一层是中间恒星系,里面基地对应每个玩家,第二层还有拓扑图,里面是拓扑关系,有一个节点的图,联盟什么的都在里面,对应的是联盟可以占领很多恒星系。
说到优化,最主要的就是光,基地没什么大问题,主要是恒星系的光源,该光源是居中的,如何补光是个问题。
这个项目有一个利好的点是场景的舰船不需要做动画,所以这方面算力可以节省出来,让我们在运动表现、光影表现里面做一些额外的加强。比如战斗时的实时光影反馈等,之后都会解读。
再就是综合的点,包括场景的低延迟切换,使用一些场景预加载包括场景内大量对象优化时候采用分帧策略,使得重度场景在内存大的时候做快速切换;功耗体验流畅度的平衡,这也是最近几年出现的新矛盾。我们的算力往往可以满足性能的要求,但功耗往往支撑不住,用着用着电池没电了。所以我们引入了动态 FPS 概念,按照两种情况区分,一种是按用例区分,有的计算不需要高频度的更新去完成,我们会降低它的计算更新频率;另一种,操作的时候我们需要达到一个平滑的体验,所以在操作的时候把帧率提高,非操作时候降帧。效果还是非常好的。
我们现在已经整体过了一遍,接下来我们会具体的讲一些细节。接下来部分由我们的技术专家陈石为大家进行。