網絡遊戲服務器架構(轉)

網絡遊戲通常採用C/S結構,客戶端負責繪製遊戲世界的實時畫面,服務器端則負責響應全部客戶端的鏈接請求和遊戲邏輯處理,並控制全部客戶端的畫面繪製,客戶端與服務器經過網絡數據包交互完成每一步遊戲邏輯。sql

網關服務器方式,主要職責是將客戶端通訊和遊戲服務器隔離。數據庫

網關服務器只負責解析數據包、加解密、超時處理、過濾錯誤包,客戶端只需創建和網關服務器的鏈接便可進入遊戲,無需與遊戲服務器直接鏈接。緩存

網關服務器分爲LoginGate(登陸網關服務器)、GameGate(遊戲網關服務器)。服務器

 

1.LoginGate主要負責在玩家登陸時維護客戶端與LoginServer之間的網絡鏈接與通信,對  網絡

  LoginServer和客戶端的通訊數據進行加密、校驗。數據庫設計

2.LoginServer主要功能驗證玩家帳號是否合法,並生成一個登陸憑證SESSIONKEY。分佈式

3.GameGate主要負責客戶端與GameServer之間網絡鏈接和通信,對客戶端請求和發送數據作簡單分析。性能

4.GameServer主要負責遊戲邏輯處理,包括戰鬥系統、任務系統、角色系統、地圖系統等。加密

5.DBServer主要負責遊戲數據緩存,包括玩家遊戲屬性數據,下降數據庫壓力。設計

6.Mserver負責一組服務器中對多臺GameServer之間數據轉發和廣播。

7.Mysql負責數據持久化存儲。

服務端事件系統

什麼是事件系統

事件系統是整個WebGame系統裏一個核心的組成部分,它控制着遊戲的進程,使遊戲可以及時執行到期命令。

事件是指遊戲裏玩家的某個活動指令,它能夠分爲瞬時活動和非瞬時活動。

瞬時活動顧名思義就是在玩家發出指令的瞬間就能完成的活動。

玩家從NPC裏購買一瓶藥水,在玩家發出這個指令後,玩家的金錢減小,藥水增長1瓶,這一切都在玩家發出指令後瞬間完成。

而非瞬時活動則是在玩家發出某個指令後一段時間纔會被執行。

例如RPG遊戲裏玩家鼠標點擊地圖上某個怪物進行攻擊。這個攻擊過程就是一個非瞬時過程,它有了一個戰鬥的過程,這個過程須要消耗必定的時間。

在WebGame裏,玩家的不少操做能夠看做時候瞬時事件和非瞬時事件的結合。

例如在策略遊戲裏升級建築物,瞬時事件是村莊資源減小,非瞬時事件是建築物建設,非瞬時事件的結果是建築物等級上升。

好比策略遊戲中的軍隊戰爭,瞬時事件是當前村莊的士兵減小,非瞬時事件是減小的士兵移動到須要攻擊的村莊,結果是,兩個村莊開打了。

數據庫存儲方式與內存存儲方式對比:

遊戲中的事件隊列會比較多,體如今數量和類型上。各類各樣的事件隊列。

SLG遊戲中:

  1.城池建造建築。

  2.城池間戰爭。

  3.城池造兵。

  4.研究科技。

RPG遊戲中:

  1.戰鬥打怪或PK。

  2.連續打怪掛機。

  3.修煉掛機。

  4.技能修煉。

LINUX消息隊列存儲的優點在於下降了PHP進程對數據庫查詢壓力,缺點是服務器宕機,內存中存儲的消息事件隊列將會丟失,RPG打怪事件隊列丟失影響不大,只是當前打的這個怪物無效,可是其餘類型的事件隊列丟失話有可能影響巨大,還有查詢到期事件的效率問題。

 

客戶端玩家發起戰鬥事件指令,服務端PHP接收到該事件,進行戰鬥合法性驗證後將該事件即相關運算數據存儲到LINUX消息隊列中,PHP戰鬥進程監聽LINUX消息隊列。

若是發現消息隊列中有戰鬥事件:

1.PHP運算進程進行運算。

2.PHP運算進程在運算完以後將運算結果寫入玩家戰鬥結果DB內存表中存儲,並將戰報藉助IM推送到客戶端進行播放。(注:戰鬥結果是存DB中仍是存入LINUX消息隊列或MEMCACHE內存中?)

3.PHP戰鬥結束進程監聽數據庫中玩家戰鬥結果表,戰鬥結束時間到,則刪除該條數據,

  並處理戰鬥獎勵。

4.避免玩家重複發起戰鬥事件,能夠在服務端經過玩家ID驗證是否有正在戰鬥的戰鬥隊列。(注:是否須要作服務端戰鬥狀態驗證?怎麼作?查詢檢索?)

綜上分析,服務端戰鬥相關進程會有兩個以上,PHP監聽戰鬥事件並運算進程,PHP監聽戰鬥結束進程。 PHP處理戰鬥運算進程能夠擴展出戰鬥運算分佈式服務器。

對於任何項目,一個好的數據庫設計極其重要,對於WEBGAME來講就更是重中之重了。一個好的數據庫設計至關於一付好的骨架和脈絡,當你的骨架搭建好,脈絡理順後,再進行遊戲功能代碼的時候將會很是順暢。

怎麼樣才能設計好一款WEBGAME的數據庫呢?

在設計前因作好以下準備:

1.對於遊戲業務邏輯要至關清晰。

2.多和遊戲策劃人員進行溝通,充分了解遊戲功能需求。

3.發現遊戲邏輯部分有矛盾時及時向策劃人員反饋、調整。

4.對於遊戲功能先按模塊進行劃分,而後再細化到每張表結構。

5.對於遊戲邏輯複雜的功能點須要反覆推敲。

開始設計數據庫的時候因注意:

1.表名、字段名規範化,按遊戲功能模塊劃分邏輯相近的表放在一塊兒。
2.合理的區分遊戲配置數據表和玩家數據表。
3.遊戲配置數據表和遊戲玩家數據表在表名上區分開,或則分庫。
4.合理權衡表結構的邏輯關係、性能優、易理解、易擴展。
5.表字段類型長度設置合適,能用int就不要用varchar,能用mediumint就不要用int。
6.合理使用數據庫表的縱切與橫切來下降表壓力。
7.合理規劃表結構,經常使用字段和很是用字段,儘可能在設計上避免關聯查詢。
8.必定要用INNODB事務表,遊戲數據表中到處都是事務關聯數據。
9.合理使用JSON格式進行數據存儲。
10.數據冗餘和性能權衡是個問題,好比用戶暱稱、職業等字段。
11.設計好表索引字段、用好聯合索引。
12.在合適的功能上用好數據庫內存表。
13.經過SQL來驗證數據是否存在時必定要用COUNT(*)。
14.主從數據庫用在遊戲中會有數據延遲問題,不夠實時。
15.合理的規劃拆分數據庫。
相關文章
相關標籤/搜索