
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 概念 ,按照两种情况区分,一种是按用例区分,有的计算不需要高频度的更新去完成,我们会降低它的计算更新频率 ;另一种 ,操作的时候我们需要达到一个平滑的体验 ,所以在操作的时候把帧率提高 ,非操作时候降帧。效果还是非常好的 。
我们现在已经整体过了一遍,接下来我们会具体的讲一些细节。接下来部分由我们的技术专家陈石为大家进行。