昨天参加了网易游戏学院的公开日《技术进步引发的灵感革命》,干货十足,期间做了一些笔记,分享一下。
在广州好几年了,也是第一次到科韵路信息港,下午去的早了些就在周围逛了逛,熟悉了一下地形和周边的小吃(主要是没吃午饭,到处找吃,只找到一家全家)。太热了又逛的差不多了,就来到了网易大厦。
我去的太早,还担心里面没人。进去之后,发现好多漂亮的礼仪小姐早已经在迎接嘉宾了(可惜没拍照)。进入会场,大屏幕,电影院的感觉,找了个好位置开始看网易的宣传片。
演讲开始~
《乱斗西游》是一款完美融合MOBA和ARPG玩法的革命性3D动作手游,上市以来表现优异,多次获得苹果官方推荐并入选“App Store 2014年度精选”。作为网易第一款3D手游,在自研引擎NeoX上如何做多线程渲染方案?采用了哪些跨平台/渲染/网络同步/存储方案?如何为跨服设计服务器架构?诸多难题,本次由该项目主程陈伊力为您一一详解。
PPT: http://www.youxituoluo.com/78062.html
注意NeoX的发音,没错,就是牛X引擎,名字够牛。乱斗西游在立项初期,在游戏引擎选择上面也考虑了诸多,比如商业的Unity, Unreal等,也包括网易自研的引擎,最后,他们选择了自研的牛X引擎。服务端架构方面使用了MobileServer多服架构(主要语言Python,没有过多介绍)。数据库使用mongodb,目前乱斗西游4台服务器可支持10万玩家。
在提供客户端效率方面,采用了多线程渲染。将逻辑线程和渲染线程分离。线程消息队列使用了无锁的RingBuffer和Double Buffer(双缓存交换队列)。通过Profile分析瓶颈,性能得到不断优化。
同步技术的迭代,这也是我比较关心的内容。在项目初期,考虑到当时的手机网络环境,乱斗西游只考虑了异步对战(即不是很真实的玩家实时对战,对战的只是带有一份玩家数据的机器人)。但是,他们非常的清楚,异步对战不是未来,同期也越来越多游戏加入了同步对战。所以,在同步对战方面,乱斗西游采取了分步骤迭代的方式,不久后推出了WIFI对战功能,即在同一WIFI网络下实现的同步对战功能。实现的方式是主客机的方式,即其中一台机器做主机,另外一台机器做客机,只在WIFI网络内传输数据。再后来,为了跨服跨网络的同步对战,使用了Router服的方式来实现。即玩家连接到Router服,Router服只负责转发。这几种同步对战方式我之前都考虑过,在上家公司做服务端主程时都给出过具体的方案。我也清楚的知道,这也都不是未来,这些方案主要特点是简单,能够快速开发并上线,未来一定是基于服务端计算的真实同步PVP。目前, 乱斗西游正在实现真实同步PVP。
在同步的实现和优化方面,乱斗西游采取了客户端先行,服务端矫正的方式。比如客户端的移动先行,在位置出现偏差时,采取一种比较温和的方式进行矫正。比如,在角色被强制位移时进行矫正,位移速度根据误差进行缩放等等。
同步的实现方式,一种是像War3星际的帧同步(帧锁定)方式。这种方式要求严格控帧,服务端和客户端必须步调一致,断线重连比较复杂,落后需要补帧。由于MoibleServer中Python大量使用了dictionary,遍历的时候是无序,使用帧同步方式很难保证每次遍历的顺序都是一致的,再加上其他很多原因,乱斗西游未采取帧同步的方式。
另外一种同步实现的方式,就是LOL、Dota2等的实现方式,状态同步,服务端承载了所有运算,客户端只负责发出指令和显示。目前乱斗西游采取的是这种方式。
在同步战斗的网络协议方面,乱斗西游采取了UDP的方式。原因是TCP的滑动窗口流量控制机制太不可控,采用UDP的方式可以做到更加高效,对丢包的处理更加可控。
优化方面,使用Neon指令集(ARM Cortex™-A 系列处理器的 128 位 SIMD单指令多数据架构扩展)。
Python常量使用优化(Python并没有提供常量支持,实际使用时会被当做字典的项来进行查找,影响效率,所以上线前将常量自动替换为实际的数值提供效率)。
为了防止脚本被破解,通过修改脚本虚拟机,将OpCode(字节码)打乱。
作为网易首款TPS视角MOBA游戏,《无尽战区》不仅在玩法上做出了突破,同时在画面效果和品质上也在不断探索和迭代:日式动漫还是美式卡通?虚幻还是真实?在从无到有的紧张开发期中如何打破层层迷障,创造出有自己特色的渲染方案?本次Inception工作室的李冰将为大家分享,在《无尽战区》画面效果迭代中积累的点点滴滴。
天下引擎,需求:重视手感,响应迅速。风格参考了Team Fortness2。分享了卡通角色渲染方案的迭代过程,最后的渲染效果的确很赞。
CloudGI是一款网易自研的烘培器,它可以在数秒钟内计算完软影、AO、间接光照、体光源等全局光照效果(一台机器),已经为网易内部数十款游戏提供烘培服务。本次由CloudGI的开发者李文耀,为大家介绍如何利用GPU把烘培时间减少到几秒的级别,包括烘培基本算法、烘培直接光照、烘培间接光照三个部分。
很牛逼,能把耗时的烘焙时间减小到10秒,不过只能针对网易自研的引擎烘焙优化。
次世代的画面表现对资源的需求量是巨大的,如何在符合国内玩家软硬件水准的情况下,驱动一个巨大的无缝游戏世界?《天谕》的自研引擎通过严格的Budget系统和细致的Streaming/LOD/Proxy等技术,将大世界渲染中所需的资源降低了1-2个数量级。其中的技术细节和心得体会,会在此逐一道来。
PPT: http://www.youxituoluo.com/78063.html
天谕的大世界有150平方公里,比魔兽世界的卡利姆多大陆还大(100平方公里)。一同随去的天鸿同学直呼《天谕》引擎的伟大。要求美术所有贴图都有一张替代贴图,场景任意时刻和位置面数不能超过50万面。运用科学的方法,通过机器人跑遍整个场景进行离线分析和LOD优化。通过Proxy技术将场景切分为一个个立方体,对立方体内的模型物件进行整体的LOD优化。在保证了帧数流畅的前提下, 也保证了画面的精致。
说到手游中的重度游戏MMO,如何提供一个稳定高效的手游MMO服务器引擎?梦幻西游手游如何做到万人同时在线?手游和端游在MMO上有何不同?AOI如何实现?通过什么样的开发流程就可以保证在产品上线时稳定,不会出现大面积DOWN机的情况? 一整套解决方案,你值得拥有。
PPT: http://www.youxituoluo.com/78130.html
梦幻手游服务端架构来自端游的服务器架构,支持单服2.2W人,最高在线达到200W人。服务端架构如下:
由于是沿用端游的架构吧,这是一种早期比较常见的服务端架构。Server采用单进程多线程的方式,同时保证写逻辑代码时只在单一线程,不需要考虑多线程问题。AOI(Area Of Interest)的实现主要有两种:格子和十字链表。梦幻手游采用的是九宫格的格子算法。(AOI算法主要解决NPC和玩家位置同步,AI事件触发的算法问题,可以这样理解,最简单直接的算法,是遍历整个场景的NPC或玩家,将位置信息同步给玩家。显然这样的效率是很低的,因为离你很远的玩家的位置其实是不需要的。) 数据存储使用udb,nosql,binlog。AI使用行为树,将AI的设定全部交给了策划同学。
使用valgrind追踪内存泄露问题,统计脚本虚拟机object数量分析瓶颈。IO操作全部异步化。项目管理采用不强制的CodeReview,有自动化的协议测试Case,分析CodeCoverage,使用代码静态分析工具。
### 小结
公开日组织的不错,演讲嘉宾的内容也干货十足。中间和最后有抽奖环节,可惜没中。。在游戏自研领域,网易体现了其强大的研发实力。总的来说,受益匪浅,不虚此行。