感谢电信开放平台和CSDN的邀请。最初给我这个题目的时候,因为我一直主管研发,有一款游戏目前开发两年了,是一款MOBA的手游,我主管研发这一块,现在讲一下我们这款游戏网络后台设计实现。这款游戏叫做《突击军团》,采用Unity3D引擎,这款游戏做了多个平台,Windows、iOS、安卓全平台,全3D竞技类多人即时对战网游。
游戏是2012年立项,九月份跟中国电信合作,植入应用内的收费,在电信平台做一个正式的发行。年底前肯定正式版全部完成,各个平台,因为设计的时候整体设计游戏,从引擎到网络,设计完成后根据各个平台的小组做不同平台的一些特点的优化。由于Unity引擎网络这一块非常弱,项目开始就给Unity定制了一套网络的引擎。
设计的要求,当时最初的设计第一个要支持比如说大数据量,因为是实时数据传送,包括位置,还有所有的操作,所有的战斗,支持万人同时在线。服务器端提供游戏逻辑的处理,顺序、无序和优先级。因为对战过程中要求可能是某一个玩家的网络组件,要求顺序接收到所有的包,乱序会造成调用出现一些异常,所以说引擎要提供这么几个功能。无序就是不需要按顺序的一些处理,比如说一些消息,还有优先级的数据包。
数据支持就是可靠、不可靠多种协议。跨平台跨语言支持RPC调用支持,数据库及连接池支持,我们专门开发一个嵌入到里面的插件。手机有时断时续的网络情况这种情况对战过程当中解决。
系统结构我简单画一个,客户端这边的插件包括ID管理,ID管理收发,RPC的调用,还有通信。服务器分为三块,网络通信的模块主要是处理网络数据的收发,游戏逻辑和RPC的调用,最后数据库连接池。中间两个连接线虚线,我们考虑客户端可能直接对传一下数据包节省一下带宽,当时也做了这个模块。
通信协议提供了UDP和TCP的支持,主要看看实时性和同步的具体要求和网络具体状况。如果做实时同步的情况,这个游戏经过多次修正和测试,做手游里面还是有一些技巧和经验的。
下面我讲一下客户端的设计,客户端插件包含了一些组件,主要功能如下:
客户端组件ID管理,分配分发和回收,是跨网络的调用,需要RPC调用支持。网络质量及心跳检测,对战的过程中有实时的房间管理与控制。我们做了P2P的,后面运营发现这个比较差,于是剔除了,第三方可以做一些认证接口。服务器端的网络为了支持大并发,我们采用了EPOLLET这种实现高并发,开发语言C和C++,最初造成一些内存泄露,后来换了智能指针解决了问题。采用原子锁来实现对客户端连接处理,处理的效能提高了不少。服务器支持顺序、无序优先级的数据包处理,多种协议,P2P打洞支持。游戏逻辑有一些管理要在服务器端做处理,还有消息和广播,当时做在一起,一个模块部署可以分开在其他机器上。由于虚拟世界在服务器端有时候进行一些逻辑处理,这一块现在还没有完全的实现,正在做,这一块工作量太大了,可以保证主机不会掉线,估计到年底这一块就完了。现在用的其他方案替代,主机掉线的情况有时候对服务器有一些影响。
房间管理和游戏模式的管理,还有后台定时器和调度。具体业务模块处理一些服务器端RPC一些统一的管理。
服务器端数据的存储,这一块比较简单,指连接池和内存对象的缓存机制,根据我们的数据库,我们做了一个比较简单缓存的映射,主要是提高处理层的效率。
数据库处理这一块还有存储这一块都采用对接其他普通的一些数据库。
在开发过程中实际上遇到了很多问题,最初的时候内存泄露发生比较多,后面采用智能指针修复了这个问题,因为里面有很多的线程,虽然EPOLLET这种方式半线程可以实现,保证指针管理比较统一,用这种方式可以避免很多,后台编程也可能因为协调上的问题,或者编程一些问题没有注意就会造成泄露,就比较好管理。
有时游戏调用对战进行到一半就会报错崩溃或者出来,这个经过检查发现没有保证顺序执行,所以我们单独把顺序和无序、优先级这块做了一个逻辑处理。单独处理这个问题就解决了。
手机用户,平板用户信号时断时续,我们在客户端做了一套检测机制,因为手机信号很特别,有可能这两秒钟没有信号,下两秒钟有信号了,这时候不能断掉,所以我们有一个机制保证稳定。
最初我们用P2P有一些数据交换的时候,后面发现这个影响体验,打洞的效率和同步上都会带来一些不好,所以这个技术后台没有用,全部是通过服务器端转发现在是。
初期流量消耗比较大,原来客户端开发我们提供了实时同步的模式,引擎开发人员用了这种模式以后做了一些无效的数据传输,我们在数据压缩上面做了一些研究,这款游戏一个小时一兆多点的流量。下面我们跟电信也要接入它的应用内收费,游戏类收费,电信游戏类收费有一个特点支付的方式比较简单,有一个问题就是支付金额额度比较小,这款游戏支付额度比较大,后边根据跟开放平台这边的一些交流,我们对游戏的收费模式进行一些重新的设计,简单介绍一下我们游戏类收费的东西。
目前我们游戏分为三种货币,一种是矿石、金币和钻石,矿石经过游戏内获得,你可以经过金币购买,这款游戏是要通过矿石购买的,所以矿石对所有玩家在游戏中和战斗中能够获得,各种方式都能够获得的方式。金币是属于要花钱购买,但是它是贬值的一种货币,这种货币购买之后可以解锁一些道具,金币我们由于游戏礼包送一些金币,这个游戏礼包根据普通会员VIP会员领取不同的礼包,运营的时候做一些游戏,金币是贬值的,通过花钱购买。钻石,新增的一种货币,主要是用于VIP会员,根据VIP会员这种特点我们定制了五级,五块钱到五十块钱一个月,可以包半年也可以包一年,五级VIP可以享受不同的特权,战斗过程当中可以一级复活快速传送的那些东西,比如说做一些别人不能的,一般人没有的,然后把游戏的收费因为支付目前开通最高是15块钱,所以我们把这个游戏收费的覆盖面争取更大,让玩家可以花很少的钱就能够玩,因为是重度游戏,钻石是不参与搞活动的,所以不存在贬值的风险,我们大致上分成三个层次。
而且钻石还可以做钻石卡系统,相当于一个技能系统,用钻石可以合成不同技能,普通玩家不需要合成技能就可以买道具解锁,都可以玩的比较爽,这个提升游戏的付费面。这次优化之后,整个游戏把很多原来需要花比较多的钱的收费进行了一些改进。