专栏名称: 游戏陀螺
关注游戏创业,为游戏创业服务!
目录
相关文章推荐
游戏葡萄  ·  哪吒票房过149亿,“封神”IP是不是被游戏 ... ·  21 小时前  
BB姬  ·  LOL今年所有比赛或都使用全局BP ... ·  昨天  
51好读  ›  专栏  ›  游戏陀螺

腾讯邓君:《王者荣耀》如何从立项惨淡到华丽翻盘

游戏陀螺  · 公众号  · 游戏  · 2017-05-13 00:01

正文

5月12日下午,在Unite 2017 Shanghai的案例分享专场,腾讯《王者荣耀》项目技术总监邓君分享了题为《王者技术修炼之路》的演讲。邓君讲述了《王者荣耀》从立项之初经历的惨淡时期到华丽的翻盘过程中碰到的技术问题、游戏方向修改,以及《王者荣耀》的技术方案,实际原理、问题和优化的思路。



下文为邓君的演讲全文:


邓君:大家好,我是《王者荣耀》的邓君,很高兴今天能够有这样一个机会跟在座的同行一起聊聊技术,互相交流,也感谢Unity提供这样的机会。


这次的主题主要是讲一下《王者荣耀》从立项之初经历的惨淡时期到华丽的翻盘,这里不管碰到技术方面的问题,还是游戏方向上的改变,我是技术出身的,整个课题也是技术面的,会重点介绍《王者荣耀》和现在见到大部分不同的技术方案,它实际原理、问题和优化的思路。


先简单自我介绍一下,我是2004年加入腾讯,在腾讯做了4年多的应用层面开发,还包括web各种各样后台都做过,经历比较丰富,在2009年我回成都,刚好成都的岗位也就只有游戏部门是比较合适的,就转行做游戏了。在成都这边,参与过一个《QQ封神记》的开发,从封神记出来之后,又开发了一款游戏,这款游戏开发了三年多,游戏从1.0、2.0、3.0,这个时候再转型做手游,直接做的《王者荣耀》。


从立项的惨淡时期到华丽翻盘的《王者荣耀》


我们介绍一下《王者荣耀》,现在了解《王者荣耀》或者在玩《王者荣耀》的人确实比较多,但是我们曾经也没有想过《王者荣耀》有这样的结果。当时端游很久都没有做出来成绩,业绩和收入都面临比较大的问题。霸三国做到1.0之后,要操作多个单位,2012、2011年的时候,大家觉得特别费操作,要控制很多单位的游戏,操作起来很难,一开始可以操作5支单位然后变成3支,3支完了觉得也很痛苦,这个游戏策略性很强,慢慢把5个单位的技能合在一个身上。你要做创新,你要脱颖而出,是很难的事情。在2014年年底的时候,2015年我们准备开一个手游团队。为什么开手游团队?国内环境里面,基本上都在开发手游,能够继续开发端游或者要准备立项端游的非常少,包括腾讯也就是2、3款端游在开发,端游还是有希望的,开发的团队比较少,手游也是一个机会,希望在2015年把我们的霸三国端游在手游上呈现。这个时候我们进行了一个初期Demo的验证,Demo验证只有三个人,引擎的、框架的、后台的,大概做了两周到三周,把Demo做出来,里面有基本的进游戏、选人,然后可以释放技能,正常的战斗,到结算。但是是用Unity来做的,两、三周做完之后,觉得Unity很好用,开发确实比较高,简单的先这样,2015年才开始进行一个真正的独立招聘20、30人做手游项目,当时是这样的想法。2014年年底的时候,我们制作人去公司开会,当时这是一个非常明智的决策,我们需要马上暂停端游的开发,直接做手游。就是这样的一次决策,真正的是扭转了我们整个团队的命运。如果晚一年,可能今天的游戏就是另外一个,应该不是王者。


我们从端游转型做手游,做手游肯定要面临选择什么样的引擎,采用什么样的方案进行手游的开发。当时的环境,周边包括腾讯还有成都的创业团队,基本上都是Unity,我都不知道,大概在2013、2014年出来很多游戏都是Unity,我们做Demo的时候,也会选择大家用的,已经有产品进行验证了,同时我们也考察它适不适合我们的团队。 Unity对中小团队,包括作为一些大型项目,它有几个比较明显的优势。在两三周你就可以做出Demo,易上手是一个非常大的优势,在座可能都理解。 另外,它的工具都是很完善的,能够做到一站式解决,你不需要在这里面下载工具,那里面额外补充一些插件。另外还有它插件资源很丰富,我们从最开始做Demo的时候,基本上都是找一些我们可以用来验证我们想法的,它肯定可以加快我们开发的效率。上面这三点加起来,是它非常明显的优势,开发效率特别高。还有跨平台,那是肯定的,它本是就是跨平台的引擎。还有你能够对人员的补充,非常容易,因为在周边包括社会上招聘都很容易招聘到熟悉Unity的开发人员。我们这边直接对比以前自己做引擎,或者用过其他的引擎,从效率上来讲,我们选择了一个开发效率最高的引擎。这里面回过头来,从端游转换到手游是在2014年底,我们真正开始的时候在2015年3月份就进行开发,这个时候我们开发的周期短,我们需要尽快把手游做上线。我们本身霸三国开发大概有40、50个人,后面把周边的兄弟部门都合并在一起了,里面有一些会Unity、会手游的,还有一部分没有手游开发经验的,组合在一起,形成了100多人的团队,进行了游戏的开发。


还有一个很重要的选择,我们本身是一个网络游戏。当时在2013、2014年的时候,游戏在pvp上面比较弱,大部分是卡牌游戏、单机游戏,我们本身是一个端游,它的生命力包括趣味性也是很足的,我们做手游的目标,即使我们里面有创关,但是我们里面有最核心的东西,我们要把pvp做好,让玩家有真正的对抗,玩家与玩家有交流,体会到游戏的乐趣。所以在选择pvp,它可能就是一个网络游戏,网络游戏我们选择用什么样的同步机制呢?最常见的应该是cs状态同步,我们端游也是这样做的。后面我们为什么会选择帧同步,后面再说。


状态同步VS帧同步


先看一下状态同步的优缺点,它的安全性非常高,基本上外挂没有什么能力从中收益,基本上都是服务器校验。另外状态同步对于网络的带宽和抖动包有一个更强的适应能力,你有一个输入延迟200、300后面又好了,你其实感受不出来它不太舒服的地方,还有一个状态同步比较好的地方,在开发游戏过程中,比较容易体会到的好处,它的断线重回比较快。如果我的游戏崩溃了,回来之后需要服务器把所有重要对象的状态再同步一次过来,重新再创建出来就可以了。还有一个,它的性能上优化也比较明显,我说的性能优化是客户端的。客户端在做性能优化的时候,它可以做裁剪,我看不到的角色我可以不用创建,也可以不用对它进行运算,这是它的优点。


说完了优点,再说一下我认为的缺点。一个就是开发效率要相对帧同步差一些,很多时候你要从服务器客户端的每一个角色对象的状态之间保持一致,你很难做到它是一致的,包括客户端和服务器端更新的频率,他们对优化的一些裁剪,包括网络的一些抖动,你要让每一个状态在客户端有一个同步,是比较难,你要想调试这些东西,出现的漏洞、不一致的现象,调试周期比较长,想要达到优化好的水平,也是比较难的。另外一个,它比较难做出动作类游戏打击感和精确性。比如说你要做一个人是射击类,他的子弹每秒钟要产生几十颗,基于状态同步是比较难的事情,因为在很短时间会产生很多角色,要通过创建、销毁包括位置和运算。另外还有一个缺点,它的流量会随着游戏的复杂度,角色的多少它会是一个增长的过程。你做手游,也是想追求你在3G、4G也能够玩pvp,对你付费流量的消耗,我们希望能够做到一个比较好的水平,不希望能够打一局游戏需要消耗几十兆的数据流量。


我们再看一下帧同步,大部分人应该还是了解的。最初大家玩的心计、魔兽3都是帧同步,他们是基于局域网,网络非常好,也不需要服务器,他们直接用新型的网络就能够搞定。帧同步的优点是一个开发效率比较高,为什么说开发效率比较高?如果你整体的框架是验证通过,你把它的缺点解决了的话,你完全开发思路就跟写单机一样,你只需要遵从这样的思路,尽量保证性能,该怎么写就怎么写,相对于我们经验来说,以前要在状态同步下面做一个复杂的技能,有很多段位的技能,也许可能要开发好几天,才能有一个稍微过得去的结果,可能在帧同步下面,英雄做多段位技能很可能一天就搞定了。另外它的打击感确实比较强,打击感强除了我们说的各种反馈、特效、音效,还有它的准确性。你游戏里面看到这些挥舞的动作,它能够在比较准确的时刻就能够有反馈,包括它的密度可以做到很高的频率,是状态同步比较难做的。还有一个优点,它的流量消耗是稳定的。大家应该看过心计的录像,它的录像只有几百K,这里面就是网络流量里面全是驱动游戏的输入序列。帧同步只会随着玩家数量,流量才会增长,如果玩家固定的话,流量不管你的游戏有多复杂,你的角色有多少,它基本上都是稳定的。还有帧同步比较好的一点,可以做观战,录像的存储、回放,包括基于录像文件后续的处理都比较容易做。


说了这么多优点,它肯定也有缺点。它的缺点第一个最致命网络要求比较高,如果你的网络稍微有抖动,它是一个锁帧的,如果有这样的抖动,一段时间调用次数是不稳定的,网络命令的延迟会有挤压和舒展。另外一个缺点,它的反外挂能力很弱,帧同步逻辑都在客户端里面,你可以查得到它有没有作弊。游戏的逻辑是在客户端,你可以修改它。为什么王者敢用这样一个东西,当时选型的时候,半年的开发周期需要做出来,要做上线,要有几十个英雄,有时间的压力。另外一个这样一个游戏类型,不像成长类的游戏,它是基于单局的,单局你修改这个东西,顶多影响这一局的胜负,不会存档,你刷多少钱穿比较好的装备,这本身是一个弱成长的游戏,我们认为它不是一个致命的缺点。


你在这上面可以做到收益不明显,你做完之后我们可以发现你有没有作弊,作弊了一样有惩罚。反外挂虽然缺点在,在王者这样游戏类型下面不是特别明显。还有一个缺点,短线重回时间很长,我估计下面有王者非常多的玩家,也碰到过如果你玩着玩着最后闪退你回来有多痛苦,第二个100%等到完成你游戏进去了,游戏也结束了,这个帧同比是比较致命的,每一帧的盐酸最后才能算到正确的状态。还有一个比较大的缺点,它的逻辑性能优化有很大的压力。大家应该没有见到哪一款大型游戏用帧同步来做的,每一个逻辑对象都是需要在客户端进行运算。如果你做一个主城,主城里面有上千人,上千人角色虽然看不到它,但是你需要对它进行有效的逻辑运算,这就是它无法做非常多的游戏对象需要更新的游戏场景,这是它的缺点。


为什么《王者荣耀》选择了帧同步而放弃了状态同步


前面提到它两个优点缺点是相对的,这边的优点对于那边来说就是缺点。对于我们手游立项的时候,最重要就是时间。当时市面上正在开发的包括腾讯内部的都不止王者一款在开发,大家都在争取上线的时间,我们可能会选择一个开发时间周期最短的方案。然后我们做端游也有一个深刻的体会,做有趣的英雄,有趣的技能,它在状态同步上面很难调出一个比较满意的效果。它的优点包括我们自己对于状态同步的体会上面,最后我们依然选择帧同步的方案。选择帧同步方案,确实现在回过头来讲,我们把缺点优化掉规避掉,它带来的好处是比较明显的。我们的游戏比较好玩,除了英雄的设计包括整个技能的感觉,还有很重要的一点,它确实在做一些非常有特色的英雄,它的技能、反馈、体验上面都是做的不错,这是基于帧同步技术方案的优势。


我们选择了方案之后,当时觉得很hi,觉得这样一个技术方案开发起来得心应手,效率如此之高,做出来的效果也很好。但是它也有好的一面,也有坏的一面,技术测试版本上线后质量不好,其中技术层面应该就是这上面的三座大山。第一个同步性,同步性这块容易解决,其实也解决了;最大一个问题是网络问题,帧同步它的网络问题导致我们对它技术方案的原理没有吃透,碰到了一些问题,那时候游戏感觉延迟很重,画面卡顿,你明显感觉走路抖动的现象;第三性能问题始终存在,也一直在优化。



第一难关:同步


先看一下第一座大山,最容易解决的,说一下帧同步的技术原理,相当简单,10、20年前就有了,它要一个相同初始的状态,后面你需要有一个相同的输入,我往下一帧执行,执行的时候我所有代码的流程,大家走的是一样的,有了相同输入之后,输入包括第一帧、第二帧、第三帧,有了输入然后要执行相同流程,大家走的一模一样,这个结果调用完了以后,又有一个新状态,下一个状态大家又有一样,完成了循环,相同的状态,相同的流程,不停的这样循环下去。这个原理虽然简单,但是你要去实现它的时候,还是会有很多坑。







请到「今天看啥」查看全文