日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

网络游戏服务器架构

發布時間:2023/12/13 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 网络游戏服务器架构 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

網絡游戲一般采用C/S結構,客戶端負責繪制游戲世界的實時畫面,服務器端則負責響應所有客戶端的連接請求和游戲邏輯處理,并控制所有客戶端的畫面繪制,客戶端與服務器通過網絡數據包交互完成每一步游戲邏輯。

網關服務器方式,主要職責是將客戶端通信和游戲服務器隔離。

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

網關服務器分為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.合理的規劃拆分數據庫。

總結

以上是生活随笔為你收集整理的网络游戏服务器架构的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。