1. 程式人生 > >學習遊戲伺服器程式設計提高篇

學習遊戲伺服器程式設計提高篇

筆者介紹:姜雪偉IT公司技術合夥人,IT高階講師,CSDN社群專家,特邀編輯,暢銷書作者,國家專利發明人;已出版書籍:《手把手教你架構3D遊戲引擎》電子工業出版社和《實戰核心技術詳解》電子工業出版社等。

在上篇學習遊戲伺服器基礎篇中給讀者介紹瞭如何學習遊戲伺服器,主要針對的是想學習遊戲伺服器程式設計的開發者。學習伺服器程式設計,也是一個循序漸進的過程,學習知識還是要用於實踐開發的,實踐開發的最好方式就是去公司參與專案開發,這樣才能真正的鍛鍊自己的技能。本章介紹一下在知名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:[email protected]: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:[email protected]: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,這個對於初學者門檻比較低,它也可以處理負載均衡問題,網上參考資料非常多。後面會介紹各個伺服器的程式碼編寫以及核心模組的介紹實現。

敬請期待。。。。。。。。