从2022年5月发了一片日志之后没再发布日志了,但实际上这期间游戏爆发还是经历了数次更新,有些更新对游戏的核心体验还是影响比较大的。
按时间顺序是
v0.8.13,更新于2022.6.15,主要加入了角色跑动时的倾斜效果,优化了性能,修复了部分场景的光影。
v0.8.14,更新于2022.8.1,主要加入了头发系统,优化了战斗体验,加入元素音效修复了一些画面问题。
v0.8.15,更新于2022.11.26,主要加入了手柄按键自定义,优化了性能,减少卡顿。
可以看得出,上面0.8.14和0.8.15两次更新的间隔时间非常久。这段期间我其实是在做登陆XBOX的准备。而整件事的契机则是Digital Foundry发布的一条新闻视频。
这片视频的第一个新闻就是山寨战神登陆了uwp市场,而可以在xbox上运行。我其实一直都在考虑登陆主机的事宜,手头上也正好有一台xbox one S。因为微软的开发者政策可以说是相当平民了,零售机可以轻松地转换成开发机(只要花点钱注册成开发者)。同时在市场发布游戏的分成也很低,仅有12%,这个还是相当有诱惑力的。虽然整个市场的体量和购买力可能比起steam也差得远,技术支持也有门槛,需要通过审核成为xbox@id开发者才能获取完整的xbox 开发套件。但是在经过一些了解后,可以确认现在在xbox上发布运行uwp应用也能调用全部的GPU性能和4个独享两个共享CPU核心。这些性能还是值得一试的,正好也算是为之后正式登陆主机打一个前哨战。
将游戏发布为uwp应用并在x1s上顺利运行的过程算是踩了不少坑。从图形API 的奇怪限制(仅支持dx10.1特性的dx11和仅支持dx11特性的dx12)到超低功耗CPU孱弱性能的完全暴露,我也算是了解到了主机游戏开发人员艰苦卓绝的开发环境了。
我先把用来测试和作为后续版本主角的独立项目转成了uwp项目。为了适应x1s这捉襟见肘性能,我绞尽脑汁地去重构了随机迷宫墙面的渲染方式,甚至引入了基于ComputeShader的tilebased光照剔除,把光照系统强制扭转成了混合的deferred/forward+形式。这个也是一个必要的工作,因为实时随机生成的场景不能做烘焙的光照,只能使用大量的实时光源来丰富场景的变化,这个准备是必经之路。
以上的图片是还没有丰富光照的效果,岩壁还是光秃秃的,之后计划加入一些发光苔藓、荧光蘑菇来提供随机的照明效果。
工蚁的渲染也让我实践了一下几乎完全由shader来控制的渲染,使用DrawMeshInstancedProcedural来绘制,动画数据完全在buffer里处理,摆拖了沉重的gameobject,节约了大量的CPU开销。
再经过一些列的试错和重构之后,终于在保留全局曲面细分、全局地面雾气、HBAO、角色的椭球体阴影、动态模糊等效果的条件下在xbox one s上实现了918p(0.85*1080p)60帧。
这个关卡计划做成一个白蚁巢穴,而同一个环境会在之后的每一次追加关卡中改朝换代,可以想象成大话西游里水帘洞、盘丝洞、菩提洞的前世今生。
xbox摸底工作做了差不多之后,已经到11月中旬了。之后就是做了上一个版本更新,优化了手柄的控制,增加了自定义按键功能。同时修复了一个存在很久也很蠢的卡顿问题。由于这个卡顿发生的场合和战斗的命中是伴生的,我很长一段时间都以为这是我之前做的角色在攻击命中后的动画减速和网络传输(游戏的基础是基于mirror的网络系统)的不可避免延迟。直到我把前几个月xbox开发积累的profiling经验用上,打开了profiler仔细一看,原来这个卡顿是因为音效每次都是重新从硬盘里加载的,真是贻笑大方了。同时还修复了一些无意义的碰撞触发,因为测试都是在8核的锐龙R7 2700X上,我一直以为这个CPU玩游戏不咋地,能作为比较低的参考标准。但我另一台真正的下限测试机羿龙II X4 840T总是在战斗时卡顿,当时真的是没有信心把这个症结给找到。有些时候,做一些看似无用的努力所积累的经验,在无形中就可以壮大自己的信心,把曾经的不可能化为可能。
而从上一次更新,也就是0.8.15 control到现在,我主要做的是把游戏的本体也搬上了xbox进行适配。这一下子又让我面对了一个巨大的挑战。实际游戏里的CPU负载要比没啥东西的洞穴多的多,补了很多以前觉得对现代桌面CPU没啥必要的优化操作之后,终于把逻辑部分的耗时给压了下来。比如合并蒙皮网格,根据可见性剔除角色的IK和动画机,降低IK、物理的迭代次数种种。最后则是使用第二个摄像机进行的镜面反射渲染,这个是一个巨大的浪费,几经折腾后,基本上把主要的反射都重构成了主摄像机里的一个renderfeature,使用镜像的投影矩阵渲染筛选过的物体和特制的proxy。这才终于让帧数可以接受。同时也关了几个被评估为不重要的实时灯光,并且对柜台上的杂物进行了大规模的材质网格合并,还有射灯这种数量颇多的小物体,也经过导出合并的操作变成了每层一个的整个物体。从一个优化教程里了解到要尽量减少继承关系后,我几乎把电影院场景里的全部物体都拆了个遍,尽可能地铺开,降低层级深度。而最后,我做了两个全局性的大工程,其一是彻底重新规划了物体的层级关系,总体划分了视觉和碰撞层,大幅降低了层级之间物理碰撞的复杂度,其二是对所有材质的队列进行规划,大幅减少了setpasscall的数量,提升了srp的效率,本来以为因为为了减少overdraw的由远及近的绘制顺序,打断srp合批是不可避免的,但后来想到既然都启用depth prepas,还怕什么这个呢,还是以合批效率优先,确实收获了可见的成效。下面这个视频是优化前的效果,圣堂武士身上有很多对于xbox cpu来说的性能杀手,所以即便完成优化之后,他出现的场合帧数依然到不了60,这个应该需要从长计议了。
经过多次的实践测试后,我还发现了dx11确实比dx12的性能更好,打包的uwp模式运行在dx12下帧数不如直接打包的dx11的exe。不过Unity 2022.2版本声称大幅优化了dx12性能并结束了preview状态作为了正式版。之后等真正登录微软商店前再试试吧。
这几个月的开发,主要是让我体验到了真正开发产品级软件的挑战性。只有具备了一个坚实鲁棒的框架,我才能安心地在上面添砖加瓦,增加更多花样。
下一次更新预计在本月中旬,主打性能大幅优化和各个场景的视觉提升。
再下一次更新则是计划加入新的交互元素和武器,并且更加明确boss形象。而在这之后基本就是真正的全新内容的到来了。
敬请期待!
暂无关于此日志的评论。