总体上来看,冒险岛私服的主要功能就是处理消息,有的处理来自客户端的消息,
有的处理来自其他服务器的消息,有的两类消息都需要处理。可以采用单线程来
处理这些消息,也可以采用多线程来处理这种消息。
对于这种存在多类网络消息(有的消息来自客户端,有的来自其他冒险岛),
而且是来自多个不同玩家的消息,很自然会想到采用多线程来处理消息。采用多
线程的最大好处是能充分利用CPU资源,从而提高私服服务器的效率。特别是如今
很多私服服务器都采用了多核处理器,使用多线程更能体现其效率上的优势。
如果采用多线程,自然就会面临数据访问的同步互斥问题,如果处理不当,
便会对数据的安全性造成隐患。冒险岛服务端,对游戏数据的安全性要求比较
高,一旦核心数据出现错误,就会造成不可忽视的影响。从这个角度来看,单线
程没有必要考虑数据访问的同步互斥问题,单线程在实现时更加简便和安全。
我们设计的功能服务器全是一个个进程,这样就能实现同一物理服务器上运
行多个服务器,从而形成多进程工作的情形,就能更充分地利用CPU资源。多
进程虽然在调度效率上不如多线程,但多进程不需要考虑复杂的同步互斥问题。
有了多进程工作的效率保证,我们将私服服务器处理消息的线程设计成了单线程。单
线程保证了服务器数据的安全性,降低了开发难度。
冒险岛私服游戏平台架构:在本文的通信系统中,存在着两种网络通信模式,一种是C/S模式,比如客
户端和LS之间的通信;另一种是LN/CN模式,即各个叶节点与中心节点之间
的通信。在此冒险岛私服游戏平台架构中,为不同网络模式的不同通信方都设计了相应
的网络应用类,即C/S模型对应的ClienNteBtase和SevreNreBtase,以及LN/CN
模型对应的LaeNfeBtase和CenteNreBtase。对于服务端来讲,各个功能服务器在
网络架构中所处的地位不同,它们处理的消息来源也不同。比如对于LS来讲,
它需要处理来自客户端的消息,同时也需要处理来自sI的消息,这样,LS上就
必须存在esvreNreBtase对象来和客户进行通信,也必须存在LaeNfeBtase对象
来和CN进行通信。而对于sI来讲,它需要和LS、HS等叶节点进行通信,这
样sI就需要有CneetNreBtase对象,sI还需要和中心节点MS进行通信,那么sI
就需要有LaeNfeBtase对象。同样的方法,可以分析出其他服务器上所应有的对
象,总结如下表:
冒险岛私服消息队列:对于底层网络来讲,每个网络层都有两个消息队列,一个用来存放接收到的
消息,称为niQueue;另一个用来存放需要发送出去的消息,称为uoQtueue。每
个网络层还分别启动了两个线程,一个用于不停地发送uoQtueue中的数据,另
一个用于不停地将网络上接收到的数据存储于niQueue中。对于各个功能服务器
来讲,所要做的就是不停地将网络层niQueue中的消息取出来进行处理,需要发
消息时将消息扔给网络层发出去。本文采用了单线程来处理所有网络层的消息。
后来在开发过程中也证实了这个选择是正确的。如果采用多线程,不但要面临多
线程访问数据的问题,还需要对消息处理进行同步,因为有时处理一个消息时,
需要处理完另一个网络层收到的某条消息,这种情况需要做消息同步,就比较复
杂了。这样,当服务器上存在两个网络层时,服务器的工作模式可以表示为:
虽然在处理接收和发送网络消息时采用了多线程,但由于这些线程之间没有
任何关系,因而没有必要做数据同步互斥处理。服务器可以这样来安排各个线程
的工作:服务器启动时就启动网络层的消息接收线程和发送线程,另外再启动唯
一的消息处理线程。网络层的线程各司其职,管理好各自的消息队列即可。消息
处理线程逐个查询每个网络层的niQueue,有消息就取出处理,没消息时就查询
下一个网络层,如此循环即可。
在选择单线程还是多线程来处理网络消息时,为了保证服务端数据的安全
性,同时也为了方便开发,我们采用了单线程来处理网络消息。虽然单线程在效
率上不如多线程,但服务端的多进程工作模式,一定程度上弥补了单线程的这点
不足。
冒险岛私服开发接口设计:私服游戏平台最重要的功能自然是为玩家提供各种各样的冒险岛私服游戏。这些棋
牌游戏的种类繁多,就算冒险岛游戏和联众游戏,它们平台上现有的游戏种类也仅
仅是众多冒险岛私服游戏中的一部分。冒险岛私服游戏流传于民间,不同地区有不同玩法,本
文的冒险岛私服游戏平台设计成可区域运营,就是为了能让各区域的玩家能玩到真正的
本地游戏。这些本地特色游戏种类繁多,规则复杂,全由一个开发团队来开发显
然不是很合适。因而本文提供了一套开放的第三方游戏开发接口,只要游戏开发
者按照这个接口来开发游戏,那么游戏就可以成功地接入到此冒险岛私服游戏平台中
来。有了第三方开发接口,就可以让不同的游戏开发者来开发游戏,为那些了解
特色游戏具体规则的开发团队提供了便利,大大提高了开发效率。
第三方开发的冒险岛私服游戏,应该通过何种方式和平台交互?常用的方法是,第
三方开发的冒险岛私服游戏以进程的方式接入平台,它和平台之间的通信可以通过进程
间的通信来实现,冒险岛游戏和联众游戏的客户端都采用了这种方式。这种方法的
优点是,冒险岛私服游戏和平台之间的独立性比较强,可以独立对冒险岛私服游戏进行相关维
护和更新,而不会影响到平台的正常运行。这种方法也存在着缺点,就是进程间
的通信效率相对来讲并不高。为了提高相互之间的通信效率,可以考虑第三方以
函数库的形式提供给平台。函数库通常分为静态库和动态库两种,它们之间的优
劣我们在第2章已经进行了说明,很显然,DLL的优点更适合用在这里。例如,
采用了DLL后,可以十分方便地对冒险岛私服游戏进行版本更新,而不需要对客户端
或者服务端重新编译发布;如果不采用DLL,那么客户端需要加载所有的冒险岛私服
游戏代码,客户端将变得十分庞大。本文的服务端和客户端的第三方功能,都以
DLL的形式提供给平台。
第三方游戏开发接口分为两部分,即服务端的第三方开发接口和客户端的第
三方开发接口。既然第三方开发接口是为开发相关冒险岛私服游戏设定的,那么就将功
能作如下划分:第三方负责玩家进入桌子之后的逻辑处理,而玩家在桌子外的逻
辑由平台处理。也就是说,玩家给服务端发送了请求进入桌子的消息,这时对于
服务端来讲,从判断能不能进入桌子开始,接下来的逻辑就由第三方的服务端来
实现了。对客户端来说,如果成功加入桌子,这时客户端会跳出游戏界面,从这
时开始,客户端的逻辑就由第三方的客户端来负责。玩家退出桌子后,平台接着
处理相关逻辑。由于所有冒险岛私服游戏在进入桌子、准备游戏以及退出游戏的模式都
类似,因而这类功能全部由平台来实现,通过接口函数供第三方调用。其他与游
戏相关的功能,由第三方实现。。