|
文/顾煜 专栏:https://zhuanlan.zhihu.com/gu-yu
前文回顾:The world at your fingertips — 天涯明月刀幕后14(性能)
给一路狂奔的叙事踩一下刹车,我们暂停一下主线,聊聊引擎开发的得失,探讨一下为什么要从头开发一个引擎,我们有些什么考虑。
天刀引擎始于工作室的上一个MMORPG,在2年左右的开发中,逐渐被我们一点点推翻重写。
不直接从零开发引擎,而选择逐渐转换技术底层,直到成为新的引擎,这看上去并不是一条最短的路径。但我们项目并不拥有前置的、奢侈的引擎开发时间。所有引擎开发工作都是和时间赛跑,伴随项目开发,逐渐成型。我们需要兼顾每一个milestone,考虑每一次评审,确保活下来。产出速度是最重要的,引擎的生成只是副产品,或者说,是一个路径,通向更高质量的画面表现。
最早动手的是底层序列化模块,直接换成新的资源格式,用元信息描述所有的字段,于是可以让序列化过程更简单,对编辑器开发更友好,大量字段可自解释。游戏运行时刻也可以随时从console命令中修改任何字段,无需特别开发,直接拥有了更友善的debug能力。附送垃圾回收能力,绕开繁琐的指针管理,让对象生命周期管理更方便。这部分底层模块,和原有引擎的底层模块并存了相当长的时间。
然后渲染模块逐渐被重写,渲染管线完全不同,材质系统焕然一新。基于PBR系统的材质拥有了更强的表现力,而且可以在各种不同的光照场合拥有一致的表现。各种有趣特性被逐渐加入,后续所有的渲染开发都围绕着新的渲染模块开发。然而旧的资源,还是用旧的格式,因为我们并没有精力重写所有的工具集,pipeline先用旧的,不用耽误美术工作。我们写了在内存中的转换器,引擎启动后,继续使用旧Loader来加载所有的资源,读进内存后,进行on-fly的转换,换成我们需要的数据结构。这个无疑减慢了loading速度,但也让整个代码逻辑更简单,更顺畅。当然,这只是一个过渡,最终我们肯定要改掉的,可我们不能停下向前的脚步。
随后工具集也逐渐被重写,Editor重新开发,这是一个相当长的过程,贯穿游戏开发始终。编辑器功能不足和稳定性问题,长时间一直很好的压制了美术策划的生产力,导致他们无法火力全开的工作。毫无疑问,如有更现成可用的工具,天刀的开发一定更快完成。但既然已经走了这么远,我们也只能咬牙硬撑。
再往后,一些重要的基础模块被中间件替代。UI方面使用了Scaleform,当时行业标准组件。动画系统使用了morpheme,分离动画逻辑和表现,特效系统也被重写,使用了FxStudio,有良好的编辑界面,只需要做好渲染模块,就可以快速插入引擎。
新引擎基本和原有引擎脱离了关系,原有一个模块一个模块的被替换。最后要做的,就是整体剥离,将大量逻辑代码依赖的数学库、工具函数、旧的资源管理、Loader等等做整体替换。这个过程非常枯燥,基本涉及到了整个引擎的方方面面,所有部分都被涉及。新入职的程序员苦战了数周,沉默寡言的死磕所有的编译错误,一度被我误认为其人性格内向,这应该是我职业生涯的最大误判。EASTL等基础库也被引入,替换了原先VC自带的STL库,提供更好的基础能力。
我们终于扛住了所有的压力,让引擎成型。
整个引擎的开发,付出了巨大的代价,项目开发进程肯定是被拖延了,真有必要自己从头做,而不是直接用商业引擎吗?这个问题,我一直在反省,一直在思考。随着我工作重心的改变,工作方向的转变,我一直会得出不同的答案,每一套说法,似乎又都能自圆其说,逻辑自洽。
讨论这个问题之前,我们先要排除一个前提,就是这个讨论只涉及到一流商业引擎和自研团队自研引擎对比。天刀项目刚开工的时候也用商业引擎,但那个质量是不够的,不在讨论范围内。
那么问题就变成,为什么天刀不直接使用类似UE3之类的引擎,非要从头开发。
在我看来,UE3这样的商业引擎,有一些非常大的好处:工具链成熟,便于数据开发团队快速产出内容;行业周边中间件成熟,接入无负担;历史成功项目多,引擎核心稳定;开发生态氛围好,有利于招聘熟练工人才,外包公司也熟练。
所以一个团队用这样的引擎,很快就可以在相对较短的时间内做出品质中上的产品。能不能进一步提高品质,就要看团队的进取心,如果团队能深入掌握引擎,逐渐修改和优化底层,让引擎更适配自己的游戏,便能百尺竿头更进一步。
那自研引擎的优势何在呢?自研引擎的能力,和团队的能力密切相关,且要有宽松的氛围,充足的耐心。在那个Unity尚未一统江湖的年代,万马奔腾百花齐放,每个尚有追求的引擎程序员,硬盘里总有那么一个文件夹,存在做了一半的引擎,梦想成为下一个商业引擎。然而现实特别残酷,绝大多数引擎并不具备基本的质量,终究只能老死在硬盘的角落。少数被进一步开发的引擎,也往往因为其不够完善,而逐渐拖死了整个开发团队。
我很难简单回答这个问题,我们把目光移到更为成熟的海外市场,来寻找这个答案。
早年间的海外市场,引擎也是百花齐放,但随着产业成熟,竞争激烈,逐渐收敛成三大主流商业引擎,老牌引擎Unreal、技术先锋CryEngine和后期之秀unity。然而我们可以看见,依然有很多顶尖游戏,使用了自研引擎,而各大主流厂商,也都有自己的引擎技术。难道它们不知道使用商业引擎的优点么?显然不会。
我认为原因有四。
一是当年商业引擎的授权模式,对开发商来说并不友好。早年售卖引擎的市场非常小,所以引擎一般售价都极其昂贵,这阻碍了小开发商的使用。而对于大开发商,引擎往往有利润分成的说法,还需要从最后的收入中分得不低的利润比例,基本无法被大厂商接受。如果开发商不愿意使用分成的模式,可以买断引擎使用资格,这又需要额外的一大笔投入。这个模式弊端已经显露很久。直到近年Unity领导了一波大变革,以相当低的售价提供了简单但够用的引擎,旧体系崩坏,新世界到来,UE和CryEngine也只能仓促间跟进。
二是大厂商往往有较长的开发历史,已经有一定的技术积累。比如UBISOFT在20年前,就有内部的引擎,即使质量一般,易用性不够,但依然是一个可以产出高质量产品的引擎。围绕这个引擎也产生了很多的开发工具和生态,总有一部分团队愿意围绕自己的引擎做很多工作。更何况在一些方面,大厂的内部引擎质量并不比外部引擎差,除了易用性外,其他很多方面甚至都可以超越商用引擎。放弃自己的积累全部转用新的引擎,成本上和情感上都不是那么容易接受的。
三是将自己的安危绑定在具体的引擎,对大厂来说是很难承受的风险,这个风险体现在授权模式变更、引擎自身发展等多方面。通常大厂会在应用引擎后进行深度定制。当年我们用了将近8年的Unreal2引擎,虽然Epicgames已经将引擎升级到UE3,但我们还是在UE2上耕耘,除了UE Logo和工具链框架,基本所有的底层、上层代码全被我们翻新了一遍,加入各种自己开发的高端特性。但随着授权期的接近,厂商对于引擎授权策略有可能有修改,这导致了我们被迫全部迁移到新的引擎,带来了极大的成本。再比如如果有厂商当年深度跟进CryEngine,那么随着CryEngine的引擎业务开展不顺利,可以预料的厂商也会受到极大的伤害。
四是很多效果高端游戏,都是需要利用足硬件机能的。如果满足于使用通用引擎,则不容易挖掘潜力,无法把效果做到足够好。所以我们看见,市场上以画面效果著称的商业游戏,采用自研引擎的比例相当多。只有使用了自研引擎,历经多年的打磨,才容易把效果做到极致。而商业引擎往往要兼顾更多不同团队的需求,追求易用性,对于市场、技术的反应不一定及时。而且商业引擎也很难为了一个具体的项目需求定制,而自研引擎就完全没有这方面的压力,哪怕某些功能不容易做到通用、易用,先把效果做出来就好嘛。
看完海外情况,把视线移回天刀项目,回答一下刚才那个问题,为什么天刀要从头开发引擎呢?时隔多年,真相已经模糊,对错不那么重要,可以心平气和来探讨一下。
难道是商业引擎不能满足我们的技术需求吗?我们做了非常多的深度优化,效率极高。这个是最常见的一个诉求,的确也有合理性。天刀是面向相对较低端PC的引擎,所有的特性取舍,性能优化着眼点,都在更快、更省,因此舍弃了相当多的高端特性。但我们这一支引擎开发的团队,也可以对传统的商业引擎做优化,做裁剪,我们也一样有能力在UE3上做出同样的效果,类似的性能开销的。所以这个理由不能完全成立。
另一个常见的原因就是大公司要有自己的引擎技术,抵御技术风险。回过头看或许如此,但当时根本不会想这么远。腾讯每个项目都是自生自灭,奋力奔跑确保自己不被砍掉,这是丛林中唯一的生存法则。就算大家有情怀有能力有远见,也是万万不敢挑战自然规律的。
真正的原因在于,当时我们用惯了商业引擎,常有诟病,看清了种种不足,于是想做点不一样的事情。前一个项目继承过来的商业引擎不够好,整个团队有足够的技术积累,我们有把握能做出不错的渲染模块和底层框架,满足项目的需求。UE等高端引擎,由于分成机制的存在,在当时是不可能考虑的。最后环顾一下公司内部积累的技术,也不能满足项目的需求。于是大家就决定自己做一个了。从最后项目的结果来看,效果还是不错的,我们用比流行商业引擎低得多的性能开销,实现了相对不错的游戏画面,过程中整个团队有了非常好的积累,得到了很多的成长。
|
|