​


引言:6.14日“腾讯创新日:科技年技术盛宴”代表腾讯各个事业群技术实力的四级专家、腾讯微创新2016年度创意获奖团队欢聚一堂,一起畅谈AI、系统安全、架构设计、社交传播、推荐模式、游戏引擎等前沿科技和腾讯应用创新的台前幕后。来自IEG的北极光工作室群的专家工程师安柏霖,就《天涯明月刀》的游戏引擎开发历程,给大家分享了引擎开发与技术突破。


《天涯明月刀》是北极光工作室群自研的大型武侠网游,使用的是自研的游戏引擎。引擎达到了比同期游戏引擎更好的表现效果同时,还拥有了更好的更好的效率。


本次分享主要介绍在做游戏引擎的时候如何系统化的去做技术突破,通过几个视角来介绍具体的技术研发,包括:通过第一原理思维让大家了解那些事情我们可以去突破;并和大家共同分享在开发过程中的成本&收益关系;探讨工程师如何深度跨界,通过拥有产品视角,来对开发进行质的提升。



以下为安柏霖演讲实录:


我是来自IEG的北极光工作室群的安柏霖,今天就《天涯明月刀》的游戏引擎开发历程,来讲一下引擎开发与技术突破。



首先介绍一下我们的游戏。《天涯明月刀》是由IEG北极光工作室群开发的一款大型多人在线游戏,是一款PC端游。一直以来,天刀在业内受到了广泛的认可,我们在公司么外的很多奖项上也获得了很多。比如说在公信力很强的游戏制作人评选大赛上,我们获得了最佳游戏研发技术创新奖。


同时我们也有不错的成绩,2016年获得了IEG的最佳突破奖。我们后面也将在韩国运营,我们的合作伙伴nexon对于我们的评价是:“即便在韩国这样游戏非常发达的市场,天刀也有顶级的游戏画面和震撼的游戏效果“。



上面是游戏中实时运行出来的画面,而且再一个普通的消费级电脑上就能跑得很好。


我们是使用的自研游戏引擎,它是由是北极光工作室群和IEG研发部联合开发的。


游戏引擎有两个非常重要的指标:画面表现和运行效率。天刀在我们的品类和画面最好的游戏在同一个水平线上,现在画面最好的是《黑色沙漠》。效率上我们和效率最好的游戏在同一个水平线上,也就是说天刀同时拥有最好的游戏画面和最好的游戏效率,让我们的产品在市场上取得了非常好的竞争力。中间的《剑灵》使用了非常著名的商业引擎,我们的综合表现是好于商业引擎的。


今天我们来聊什么?


今天我们更侧重于聊真实产品的创新实践。和公司内部做产品的小伙伴一样,我们业面临着在有限的资源下再出尽可能好的产品,给玩家带来更好的体验。实际中的创新实践就像高考数学最后的大题,我们对着答案把这个问题搞懂和在现场解出来有天壤之别,所以解决问题的能力一直是我们长期以来非常关注的一个点。


今天的分享包括:多线程解决方案,和透明布料。同时也会包括是什么能够让这个解决方案能够构建出来。


多线程解决方案&系统化的方案构建



首先看一下多线程。我们多线程用了很多,原因非常直接,我们需要很强的效率,需要利用多核的计算资源。这就是天刀里面的一个场景,非常广阔,有1500米以上的超远视距,视野中覆盖满了植被和建筑。它的性能挑战非常高,目前市场上也只有我们可以做到这一点。



然后我们可以打出千人级别的团战,准确讲我们的性能挑战是在超大规模的场景上打出超大规模的团战。


除了性能挑战,还有另外一个维度的挑战--复杂度,这个维度上的标杆场景就是魔兽世界。《天涯明月刀》的复杂度不输魔兽世界。我们盘点了一下,载整个行业中,包括国外的商业大作中,我们都是面临着最高级别的挑战。所以在多线程模块中我们要处理好这两个挑战:性能&复杂度。



性能方面,我们的原则是尽可能让定型能够覆盖更多的模块。在引擎中,我们高达70%的引擎模块是以并行的方式去执行的。我们整个系统构建得比较好,所以让更多的模块来执行。这里补充一点就是,多线程高速运行是必要但不充分的条件,达到现在的效率还需要大量的优秀技术实现才能做到。


之前和一个老同事介绍过这件事,他意味深长的问我:”你们多线程用得这么多,Debug的过程心里一定很苦吧?“。这确实也是业内的一个共识,就是多线程是双刃剑:用了多线程,性能会更好,但是同时会成为BUG重灾区,难以处理,经常需要到项目里面最精锐的部分来处理这个问题。


在天刀中,我们可以把多线程做到非常易用,全团队都可以做多线程的编程,甚至刚毕业的小同学经过培训也可以做。而bug方面就是:几乎没有BUG。经过我们的统计,我们在多线程方面的bug总体不超过10个,debug的时间不超过一周。所以用到70%以上的覆盖率,易用且不太有BUG,在行业里非常领先。所以我们把多线程的双刃剑变成了大杀器。



复杂度处理方面我们主要是两个方面:一个是简化选择,一个是简化使用。


简化选择


多线程中有很多种模式,我们依照全面且最少的原则实现提供了3中模式,我们同事想做异步计算的时候,总有一款适合你,同时又不会太多,这样就把出问题的可能性降到最低。


简化使用


在使用的过程中,我们会刻意的把多线程模式在使用中以大家熟悉的概念进行包装,然后把接口最简化。


我们举其中一种:“常驻”模式,我们会把它包装成状态机,它在游戏开发里面是最基本的东西,接口使用上特别像单线程。这样使用起来,出错还是很难的。多线程中还有很多特别复杂的部分,我们做了强封装的处理,我们要把非常困难的东西集中在非常少数的人,由两个最棒的程序员搞定。搞定的过程中,我们借鉴了操作系统中显卡驱动的资源管理,整体方式包括生命周期、同步管理、调度等等,我们从这里得到了很多启发来实现。


系统化的方案构建


我们可以看到,多线程覆盖非常充分,使用起来非常简单,把它集中在少量的地方,由程序员干净利索的搞定。这套系统非常大非常复杂,边做边迭代的方式,想做好就比较难,需要有一个非常全面的设计。


整个构建的过程我们称之为系统化的方案构建。



可以看一下这个过程,第一是把问题进行拆解。以树状逻辑的方式一级级展开,到达子节点的时候,要做到相互独立,完全穷尽,树状非常有逻辑性。


然后开始根据这些问题,在我们的知识体系中一级一级的寻找答案,例如异步模式,在多线程领域中就会有相应的知识点。


进入到易于使用,发现它的知识点已经不在多线程领域了。我们开始找到状态机、显卡驱动系统,甚至包括做项目时的一些知识,包括有戏有什么特点,项目构成、项目资源等等。


这里可以看到我们是用一棵这样的知识体系去寻找答案。像直接的知识可以google,做多线程谷歌相关的知识,这没有问题。但是我们不太会在做多线程时候去搜显卡驱动是怎么实现的,所以这个种游戏开发或者说计算机知识领域方面的知识需要长期学习,而技术之外的知识需要长期实践。



看了这个解决方案,可能有的同学会问系统化到哪里呢?我们可以看下如果过程不那么系统化会怎么样,我们发现它是一个零散的需求点,知识结构也没有建立得特别好,是一些很零散的知识点,在解决的时候呈现点对点的轴,迭代高起,这个时候会发现整个过程是比较缓慢的。



系统化的过程就是我们是以“需求树“对“知识网”的方式来构建整体的解决方案,最后达到快速完备的构建解决方案。这对于我们在“考场”上“做题”是至关重要的。细心的同学也会发现,这个知识网太重要了,接下来我们看一下知识体系的构建。



知识体系构建


是否有空多学点?还真不是。我们这里需要注重解决两类问题:“不知道“和“知道,没想到“。”不知道”要刻意追求充分覆盖,避免盲点。”知道,没想到”,就要刻意体系化。



知识覆盖我们要追求充分覆盖,主要挑战是是量很大,我们在整个游戏开发领域中做到各方面都比较深入对于个人是很难的,怎么办?我们引入团队学习的方式。


我们以全体团队成员去覆盖整个知识体系。我们首先对知识结构进行review,刻意去避免盲点,遇到我们没有覆盖到的地方就分配相关的个人进行学习。然后以团队学习&分享的方式进行集体学习,并且对学习内容进行规划。所以知识的充分覆盖靠个人的力量不行,而是团队,刻意以知识结构review,避免盲点,这样很容易达到个人学习6倍以上的学习效率。



这里知识结构覆盖比较充分的时候,可以这个为目标:能够回答这样的问题,“行业中,多线程方案都有哪些,各自核心思想,优缺点是什么?“由此可以扩展到光照系统等等方面。



知识的体系化,解决的就是知识能够被良好的组织,认识透彻,当我们需要使用的时候,可以立刻从大脑中提取出来。我们的方法很多,其中之一可以围绕这个问题的解决方案或者核心思想构架知识体系。比如谈到负载均衡的话题,它的空间、时间、计算资源、存储资源优什么,再向外扩一级,在分布式计算、多线程、大规模战斗、开发流水线、实时渲染等等。当我们这样构建出一个体系,只要碰到负载均衡方面的问题,就一定不会错过。这样我们就可以跨领域&全面的构建方案。这个过程不是一个灵感浮现的过程,就是一个充分覆盖,体系化的过程。


第一部分的小结是,多线程性能并行很重,有非常好的控制。系统化的解决方案有清晰的分析树对上完备系统化的知识网,最后能够比较完备的把多线程大系统构建得很好。


透明布料&跨领域



透明布料部分,我们要解决的就是在要衣服这种非常复杂的透明材质,保证渲染高质量,同时高效率。


这个目前《天涯明月刀》的质量&效率是业界比较领先的。


最后达到在超大规模地图上,玩家可以穿着透明的衣服,进行超大规模的战斗。



这里我们依旧是以系统化的方式去构建解决方案,所不同的是这次的主要突破点都在“纯技术”之外。


图中所示,三个点有一个做不到,我们的技术突破就不会发生。


首先我们要清楚,学术上高效&正确是不可能的,这个可以推理出来,我们不做“死磕”,否则就会走到死胡同中去。


然后我们在开发的过程中,我们的知识体系中是有在“纯技术”方面不行的时候,从产品和开发流程角度去突破的方式,可以说这个是从实践中来的,在学术覆盖不到的时候的突破角度。


最后我们在尝试的过程中,其实失败了两次,一个月的开发只换到“这两个方向不行”的结果,但是我们会继续尝试,这个到不是因为我们对于这件事情特别执着,而是因为我们对于这件事情的价值判定是准确的,它值得我们尝试2个月。


注意这里我们遇到困难,永远不放弃的做法在实际项目中是非常危险的,在《天涯明月刀》研发过程中,这样的创新我们有几十个,失败的概率大约一半,正确的做法是评估这件事情的价值,依据价值判定投入的时间。相当于在考场上,15分的题就是要做20分钟,不能提前放弃,也不能到时间了还死磕。



所以我们如果把跨界知识,也看做知识体系的扩展的话,整个过程体系性就比较强,在我们核心体系构建比较好的情况下,逐渐扩大我们的知识面,会让开发能力大大提升。


小结


最后我们小结下本次分享的核心内容,我们聊到了:


  1. 《天涯明月刀》两个在技术方面做的比较好的地方,多线程解决方案和透明布料


  2. 聊了这两个“解”,同时也聊了如何构建这个“解”


  3. 最后我们看到项目中构建创新的关键是:


  4. 系统化构建解决方案:高效&完备


  5. 知识体系构建:充分&体系化=>跨界