
Unity 技术开放日 | 太空科幻SLG手游的渲染与优化(上篇)
Unity官方 / 2021年6月17日
在 Unity 技术开放日-北京站活动中,我们有幸邀请到j9九游会游戏为大家介绍 SLG 手游的优化策略。j9九游会 CTO 邝圣凯和j9九游会技术平台主管陈石以《Infinite Galaxy》为例 ,详细介绍了太空 SLG 游戏的优化思路和细节。
本文节选了部分精彩内容 ,完整录播已上传至 B 站 。
邝圣凯:大家好,感谢 Unity 的邀请 ,让我们j9九游会游戏有机会跟大家分享一下我们在 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 概念 ,按照两种情况区分 ,一种是按用例区分,有的计算不需要高频度的更新去完成 ,我们会降低它的计算更新频率 ;另一种 ,操作的时候我们需要达到一个平滑的体验 ,所以在操作的时候把帧率提高 ,非操作时候降帧。效果还是非常好的 。
我们现在已经整体过了一遍,接下来我们会具体的讲一些细节 。接下来部分由我们的技术专家陈石为大家进行 。