首页 > 其他 > 详细

学习游戏服务器编程提高篇

时间:2017-01-23 17:44:55      阅读:391      评论:0      收藏:0      [点我收藏+]

笔者介绍:姜雪伟IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》电子工业出版社等。

在上篇学习游戏服务器基础篇中给读者介绍了如何学习游戏服务器,主要针对的是想学习游戏服务器编程的开发者。学习服务器编程,也是一个循序渐进的过程,学习知识还是要用于实践开发的,实践开发的最好方式就是去公司参与项目开发,这样才能真正的锻炼自己的技能。本章介绍一下在知名IT公司中通常使用的游戏服务器架构设计,以及它们的编写处理方式。

一款成熟的游戏服务器,它的技术是建立在成熟产品上的,也就是说经历过上线产品验证的服务器都是可以学习的。服务器的设计其实比较复杂,本篇文章主要是介绍两种服务器,这两种服务器都是经过成功产品验证过的,一种是不带有负载均衡的,另一种是带有负载均衡的服务器,这里给读者一一介绍。

第一种服务器是不带有负载均衡的,先介绍一下服务器的基本结构,直接看图如下所示:

技术分享

这种架构的服务器在很多IT公司使用,它是针对的MMORPG或者MMORAPG大型游戏设计的,带有场景服务器的,这里的场景服务器,可以继续分解出Fight服务器以及其他服务器。先介绍各个功能服务器:

CenterServer 服务器管理器,管理所有的服务器,分配服务器的端口, 负责全局的逻辑

DBServer 角色档案cache服务器

GameServer 逻辑服务器

GateServer 网关服务器,负责消息转发

LoginServer 登录服务器, 连接账号数据库,检测用户名和密码

再介绍服务器的基本流程:用户从客户端选择游戏服务器列表,登录到LoginServer,在这个过程中先去平台服务器进行帐号的验证是否正确,通过后会通知LoginServer,然后LoginServer把验证正确的信息发送消息到CenterServer, 请求其中的GateServer的地址和端口,CenterServer找一个可用的GateServer的信息, 发送回LoginServer。LoginServer再把消息发送给客户端,然后客户端断开与LoginServer的链接,然后在与GameServer服务器链接进入到游戏场景中。

在这里注意的是GateServer与GameServer是一对一的关系,换句话说,每个GameServer能容纳的玩家数量是一定的,一旦达到GameServer的最高峰值,它就会找下一个GateServer对应的GameServer,各个GateServer服务器之间是不通信的。当然玩家的实时同步是在GameServer服务器中实现的,实时同步在服务器中的处理也是游戏服务器中的核心技术点,后面会结合着代码讲解。接下来介绍具有负载均衡服务器,先看图如下所示:

技术分享

负载均衡服务器与没有负载均衡服务器之间的区别是GateServer与GameServer之间的关系,没有负载均衡的服务器GateServer与GameServer之间是一对一的关系,而且各个GateServer之间是不通的。正常情况下一个GateServer对应一个GameServer实时在线人数能达到3000人以上。具有负载均衡的服务器,一个GateServer对应多个GameServer,而且最重要的一点是多个GateServer之间可以互相通信。而且可以随意扩展,通过配置文件既可以实现配置。配置文件事例如下所示:

"TableIndex" :
	[
		"CenterServer",
		"LoginServer",
		"GateServer",
		"GameServer",
		"DatabaseServer"
	],

	"CenterServer" :
	{
		"UUID" : 0,
		"Group" : 0,
		"ServerType" : "Single",
		"ListenPort" : 30000,
		"mysql" : "mysql://root:123456@192.168.1.11:3306/gamedata"
	},

	"LoginServer" : 
	{
		"UUID" : 1,
		"Group" : 0,
		"ServerType" : "Single",
		"ListenAddr" : "192.168.1.11",
		"ListenPort" : 30100
	},

	"DatabaseServer" :
	{
		"UUID" : 2,
		"Group" : 0,
		"ServerType" : "Single",
		"ListenAddr" : "192.168.1.11",
		"ListenPort" : 30200,
		"mysql" : "mysql://root:123456@192.168.1.11:3306/gamedata"
	},

	"GateServer" :
	{
		"UUID" : 10,
		"Group" : 0,
		"ServerType" : "Multiple",
		"ListenAddr" : ["192.168.1.11"],
		"ListenPort" : [ 30300],
		"ServerProxy" :
		[
			"GameServer" 
		]
	},

	"GameServer" :
	{
		"UUID" : 20,
		"Group" : 0,
		"ServerType" : "Multiple",
		"ListenAddr" : ["192.168.1.11"],
		"ListenPort" : [ 30400],
		"ServerProxy" :
		[
			"DatabaseServer",
		]
	}


     网络消息传输建议使用Google开源的库Protobuf-net,使用文本文件定义的消息结构体,可以通过它自带的工具转化成C#和C++,然后将生成的文件放到工程中直接调用所定义的结构体即可。

      最后,如果读者感兴趣可以学习开源框架Node.js,这个对于初学者门槛比较低,它也可以处理负载均衡问题,网上参考资料非常多。后面会介绍各个服务器的代码编写以及核心模块的介绍实现。

敬请期待。。。。。。。。




学习游戏服务器编程提高篇

原文:http://blog.csdn.net/jxw167/article/details/54691214

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!