重生细胞游戏开发的瓶颈

本文可能解开你的很多不解与疑惑。包括各种报错产生的原因,阴影效果的缺失以及某些糊成一团的特效。

以及:

文章:Floutre——Playdigious首席开发人员,负责死亡细胞手机端移植工作。
翻译润色:得配nia
原文:https://gist.github.com/FlorianB-playdigious/aea80f853d46c30df6036c113cfc4b90
本文另包含一些我与Floutre的对话内容

让我们来谈一谈我们砍掉或修改的一些内容,谈一谈它们的用例以及围绕它们所采取的一些尝试。在手机上,《重生细胞》中没有法线贴图,因为实现它对于许多手机的GPU来说都太过于吃力了,我们必须为每个模型打包一个额外的法线贴图纹理,这几乎会使游戏资源文件大小翻倍,而这些法线贴图实现的纹理阴影在手机屏幕上又没有很大很突出。鉴于美学因素对于核心游戏或享受游戏的本质来说并不那么重要,我们决定砍掉这一内容。

这些决定从来都不是轻而易举的,因为我们在内心深处尊重游戏、玩家和原始开发者的工作。砍掉任何一个功能对我们来说都是一个十分艰难且重要的决定。这也是为什么它总会再由MT或EE进一步验证的原因(除非它是一个我们无法绕过的细节或技术限制,毕竟他们的时间也很宝贵)。游戏和体验对我们来说确实很重要。我们不会仅仅因为我们不喜欢的或需要大量工作时间就砍掉某些功能,我们会评估,然后尽可能提出解决方案,最后在没有好的解决方案的情况下砍掉这个功能。
在砍掉任何东西之前,我们所考虑的解决方案总是属于这三类中的一类:①优化和修复这个问题 ②尽量减轻这个问题带来的影响 ③让导致这个问题产生的东西变得可有可无。
我们通常按照这个顺序来考虑,如果没有一个解决方案能实现风险大于回报,我们就会不得不砍掉这个功能(在得到批准之后)。而我们可能面临的风险还有很多很多,有性能上的打击、运行不稳定或糟糕的用户体验(意味着为实现解决方案所采取的步骤是解决一个用户体验的噩梦,或意味着要重做整个用户界面的面板)。通常的阻碍我们改进的原因是不可能(通常是由于技术层面上的)、没办法(我们不知道如何去做)或没时间(需要太长的时间,我们没有足够的人力或投入远小于产出)。
再谈一下法线贴图的问题。
对于“优化和修复这个问题”来说:我们没有办法优化使用法线贴图的方法,以使其能在所有手机GPU上工作而不对性能产生负面影响或导致游戏不稳定。所以,这个方案就这样了。如果你认为你可以做到这一点,而且不必重新设计我们获取游戏贴图与对应法线贴图资源的方法等......请发送简历给Floutre(Discord、Twitter均可))
没有办法“尽量减轻这个问题带来的影响”:我们不能仅保留半张法线图,也不能在模型的纹理中直接预先渲染它(对于依靠读取色带来添加颜色的资源(皮肤,BOSS)这是不可行的)。
(小插曲:我做的阴影mod就是基于这种方法,目前正在与playdigious讨论其可行性。敬请期待。)
“让导致这个问题产生的东西变得可有可无”:假如我们的解决方案能使高端设备受益于法线贴图,而低端设备则不受其影响。听起来很棒吧?但这需要采取许多步骤来实现。下面是一些被否定的方案:
1、最简单的解决方案是和PC端一样,将所有的法线贴图包含在游戏中,只有当选项被激活时才使用它们和着色器。但我们不会在选项中添加一个开关来切换是否添加阴影(这哪有听起来那么容易?)要想那样我们得有两个版本的着色器组合,一个读取并使用法线贴图,然后进行阴影着色,另一个不进行,然后再供你选择其中一个。虽然这听起来是可行的,但是它将增加许多着色器以及大量的代码来处理实际的切换。它还需要将所有储存法线的纹理与游戏资源打包,这将人为地增加游戏安装包的大小(一般说来这并不好,而且从逻辑上说较大的安装包也会对销售产生影响)。这还会使设备的内存/GPU的VRAM被大量的纹理处理需求弄得乱七八糟,因为法线图是和模型的纹理将会是一起预装的。而现在光是加载现有项目,大部分手机RAM/VRAM就已经不够用了。同样,这听起来也是可行的,但这对加载资源的代码会带来巨大改变(更容易出错),并且由于内存压力也大大增加了不稳定的风险。
2、另一个解决方案是为法线贴图提供一个特定的资源包,只在有需要时下载。对游戏安装包的大小来说会更好,但这也只是推迟了不可避免的事情罢了,而且关于内存的那些问题仍然存在。这将需要相当多的基础更改,但收效甚微。因此,我们坚持以前的想法,为每个人提供不带有法线贴图的游戏资源,即使它最终会对销售、评价产生负面影响。
这些方案在技术上是可行的,我们有能力做到这一点。但接下来要进行评估:我们有足够的人手吗?为了处理这么多的工作,我们应该推迟哪些其他任务?这些任务是否更优先,或者对游戏性/体验更重要?我们能交付给几个工程师用几天或几周的时间来解决这个问题吗,而这些视觉效果真的有那么重要吗?
答案揭晓:不值得(与细胞开发者确认过了)。我们把我们有限的资源投入到其他的任务中,比如优化生物群落的内存占用,这样山洞地图就可以加载到内存中而不会使整个应用程序崩溃。(现在山洞加载不会卡退了吧?)尽管我们都很想在某个时候恢复法线贴图,但现在和将来都会有更重要的任务,因为我们正在谈论的仅仅是出于美学上的视觉效果,而非实用效果。稳定性、功能性和性能是更重要的。也许对于那些使用高端手机以120fps运行的人来说,这似乎并不重要,他们认为视觉效果才是最重要的。如果你是那个人,恭喜你,你是那1%。但我们不会为了你个人的舒适度来换取其他99%的人玩到他们喜欢的游戏的能力。
现在你对阴影相关的问题有了更好的了解,接下来让我们来谈谈这些特效。
第一条信息:
- 游戏中有1000多种特效。
- fx特效被分离在多个纹理图上,按照用途(差不多应该是这个)被分为:敌人、武器、普通、其他奇怪的东西(可忽略)。

- 所有的fx特效纹理图都是4096 x 4096的大小。
- 一个纹理图上有数百个fx特效。它们从小到几个像素到大到非常大的精灵图都有。
好吧,这与手机有什么关系?
- 我们依靠OpenGL ES在手机上渲染游戏。Vulkan是最近才出现的,在操作系统和制造商之间还没有正式化,而且今天市场上仍在使用的一些设备没有Vulkan功能。我们甚至都不用提到Metal(你有没有听说过苹果做的东西是跨平台的?)
- 关于所支持的纹理尺寸,OpenGL ES的设置对我们来说并非顺利。2048x2048肯定是支持的。4096?不确定,这取决于手机。事实是,4096的纹理在现在几乎所有的设备上都可以安全使用,直到我们发现某个设备不支持......所以我们尽可能地坚持使用2048大小。
- 移动GPU不具备能与PC或控制台相比的缓存大小
- 手机,顾名思义它首先得是手机,而不是游戏机。在后台运行的操作系统和其他应用程序仍然会占用一些内存和CPU。如果可用的RAM过低,操作系统会试图清理任何可以安全中断的后台进程,来恢复内存。关于内存的限制范围由你手机的操作系统决定。这没有任何规范或标准。可以是50%的内存,也可以是10%,这取决于你的手机系统。如果关掉你手机上所有的程序,只玩重生细胞,这样内存还算可观(但是谁会这么做呢)。如果操作系统后台清理掉了游戏进程,只因为它占用了大量内存,我相信任何一个玩家都会觉得这一点都不好玩。
因此,这里有多个要考虑的关键点。首先是内存。一个大的纹理图需要占用一个大的内存块。纹理图越小,手机用来存储它的内存就越少,我们就有更多的内存可用于其他东西。考虑到特效的纹理图在游戏进程中将一直被使用(你是否注意到《重生细胞》使用的那“一点点”视觉特效),为特效预先锁定大约200MB的内存是不可忽视的。
此外,如果纹理图存储在RAM中,为了渲染fx贴图,它必须在GPU的可访问内存(缓存或VRAM)中。所以它必须被上传到GPU上,而在GPU上复制这么多内存是有代价的:GPU的缓存通常比RAM小(小很多),而且我们放在那里的任何东西都会占用另一个纹理(或任何数据)的空间。所以为了适应fx的纹理图,我们必须移动大量的其他纹理图引用以及数据。这些数据我们以后可能需要重新上传,而它本来可以留在缓存中。这就是所谓的内存交换。我们要尽量避免这种情况,因为复制的操作很慢。这就是造成丢失帧的原因,这就是你的游戏出现卡顿和FPS下降的原因,这就是各种内存报错产生的主要原因。
对于那些好奇的人,可以检查一下fill-rate或texel-rate是多少,并试着看看有一个4096px²的纹理图而不是多个2048px²的纹理图会有什么影响。在现代PC/控制台专用GPU上,影响不大(毕竟他们太强大了);但在旧手机的GPU上,你会丢失帧。对于手机所有的GPU来说,它还会增加能源消耗和发热。这在台式电脑上并不是啥的问题,但这是手机,是一个直接与手部皮肤接触的设备,是一个由容量有限的电池供电的设备。
因为这种种一切,我们决定减少fx纹理图的大小。为了避免在加载多个特效时出现FPS下降。为了对你的GPU和你的电池更友好(我们都知道加载《重生细胞》可以轻易融化你的手机)。我们不能分割纹理,因为特效是批处理的(一种技术,用于在屏幕上一次性绘制所有的特效,而不是一个一个绘制的,以节省绘制的调用并获得perfs)。多纹理批处理的效率较低,同样需要大量的工作(因为目前使用的游戏系统并不是为这个设计的)。修改这样的系统是非常危险的,因为它在游戏代码中的很多地方都有使用。

因此,我们采取了唯一的办法:缩小内容,直到所有内容都适合2048px²的表面。通过一些启发式的方法,只有那些受缩放影响较小的精灵才会被实际缩放。然后我们在游戏中把它们放大(对内存没有影响,对处理时间的影响可以忽略)。这一切都很顺利。在女王与海DLC出现之前,没有人注意到它。这种缩放一直都存在(至少从1.2版的移动端开始就有了)。但随着游戏内容的增加,fx贴图的数量也在不断增加。当达到一定程度时,我们不得不更积极地缩放精灵图,并且比以前缩放更多的精灵图。我们达到了这种方法的极限:一些精灵图在游戏中放大后变得模糊不清(先缩小再放大并不是一个无损的过程),这在一些精灵图上尤其明显,比如传送门的纹路(精细的细节会受到更多的影响)。
我们会在某个时候解决这个问题。或者,准确地说,EE可能会在我们之前修复它。因为即使是Switch也开始对加载这么多的特效纹理感到吃力。而且如果他们继续向纹理添加特效,他们最终会有多个4096px²的纹理,并需要为此实现多纹理批处理(或使用不同的规则分离特效,这可能会更难实现)。我们与EE紧密合作,所以他们在修改或创建游戏系统时都会考虑到我们的限制。我们还为他们提供了一些针对移动设备的优化,这样一来游戏机和PC也可以从中受益。想想自动攻击,你懂的)。
综上所述:
- 如果我们能避免的话,我们绝不会砍掉或降低一个功能。而且,在没有与Evil Empire和Motion Twin的开发人员协商的情况下,我们也绝不会自发地这样做。
- 我们和玩家一样强烈希望能提供与PC和控制台一样的体验。如果我们能做到的话,甚至想将一个游戏更好移植到手机上,尤其是像《死亡细胞》这样的杰作,是一个相当大的挑战。但这是一条崎岖的道路。我们必须做出牺牲与让步。
- 我们不是无懈可击的。我们会犯错,我们会从中学习。我们尽了最大的努力,并尽量保持开放的心态和对批评的态度。在我(作者Floutre)的工作中抽出时间来向你,我们的社区和玩家解释事情,这并非我工作的一部分,但绝对是我的精神所在与我想成为的游戏开发者的一部分原因。
- 我们尊重你,但请不要不尊重我们或我们的工作,这不是让游戏变得更好的方法。
祝你有愉快的一天,享受八小时工作制和周末,并毫不犹豫地将重生细胞介绍给你的朋友(不要怪我打广告,哈哈)。

后记:
我是得配nia,这几天我一直在与playdigious讨论给手机添加阴影效果的方法。正如上文所说,我所做的是预先渲染,即直接利用法线贴图给原图添加阴影,再放到游戏中去加载。

相关视频:BV1f84y187KR与BV1oY411y7P5
虽然这种方法的效果不能媲美PC端,但是聊胜于无,它也回避开了种种内存问题。目前我与他们协商的是先给敌怪和Boss添加阴影,Boss在3.2后是读取色带来添加颜色的,所以我就给去色图加了阴影部分再一条条手绘带有阴影颜色的色带,很麻烦但是一次手绘终身能用。好消息是他们对这个项目很感兴趣,坏消息是这个计划他们早已搁置良久(三年),目前都已经把重心放在别的游戏上了。
所以?敬请期待咯~另外国外的厂商居然比国内的还容易取得联系呢,这还挺令人吃惊的。

