網絡游戲服務器架構

網絡游戲一般采用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.合理的規劃拆分數據庫。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/445010.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/445010.shtml
英文地址,請注明出處:http://en.pswp.cn/news/445010.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

leetcode3 無重復字符最長子串

給定一個字符串,請你找出其中不含有重復字符的 最長子串 的長度。 示例 1: 輸入: "abcabcbb" 輸出: 3 解釋: 因為無重復字符的最長子串是 "abc",所以其長度為 3。 示例 2: 輸入: "bbbbb" 輸出: 1 解釋: 因為無重復字符…

如何正確編寫linux守護進程

1、守護進程,也就是通常說的Daemon進程,是Linux中的后臺服務進程。它是一個生存期較長的進程,通常獨立于控制終端并且周期性地執行某種任務或等待處理某些發生的事件。如果想讓某個進程不因為用戶或終端或其他地變化而受到影響,那…

Linux(6)-命令行的使用,history,shell腳本

命令行的使用,shell腳本1.終端shell,man1.1 Ctrlr--匹配查找歷史命令1.2 history [n] --列出歷史命令1.3!--執行歷史命令2.shell 編程2.1 shell腳本2.2 注釋2.3 指明所用的shell2.4 支持函數2.5 使用變量2.6 解析命令行參數2.7 if, for, case, while2.8 shell腳本中…

lua元表的理解

元表概念 ( Metatable)元表由鍵名為 事件 (event) 和其中的值叫作元方法 (metamethod)組成。在lua中每個值都有一個元表。而table和userdata所定義的值允許自定義對應的元表,其他都是用統一的元表。我的理解,元表,其實…

程序以及論文

本人長期承接大學計算機專業的畢業設計和論文的編寫。 主要開發語言C,C (windows或linux平臺皆可),php,c#,VC 。 課題內容可以是 管理系統,可以是 網站設計開發 可以是 網絡聊天 可以是 應用…

Github(1)-概覽,初始化倉庫

Github網頁-本地git1.github網頁1.1 主要界面1.1.1github主頁1.1.2倉庫主頁1.1.3 個人頁面1.2 注冊github賬號1.3 新建平臺倉庫2.git-本地倉庫2.1 git本地倉庫的三個區域2.2 創建一個本地倉庫GitHub 本質上是一個代碼托管平臺,它提供的是基于 Git 的代碼托管服務。G…

Lua 協程

Lua里的協程是一個原來沒見過的東西,Python的Gevent也是一個基于coroutine的python網絡開發框架。性能據說很不錯。協同的一個關鍵特征是它可以不斷顛倒調用者與被調用者之間的關系協程和一般多線程的區別是,一般多線程由系統決定該哪個線程執行&#xf…

leetcode16 最接近的三數之和

給定一個包括 n 個整數的數組 nums 和 一個目標值 target。找出 nums 中的三個整數,使得它們的和與 target 最接近。返回這三個數的和。假定每組輸入只存在唯一答案。 例如,給定數組 nums [-1,2,1,-4], 和 target 1…

LINUX下動態鏈接庫的使用-dlopen dlsym dlclose dlerror

dlopen 基本定義   功能&#xff1a;打開一個動態鏈接庫 包含頭文件&#xff1a; #include <dlfcn.h> 函數定義&#xff1a; void * dlopen( const char * pathname, int mode ); 函數描述&#xff1a; 在dlopen的&#xff08;&#xff09;函數以指定模式打開指定的動…

leecode11 盛水最多的容器

給定 n 個非負整數 a1&#xff0c;a2&#xff0c;...&#xff0c;an&#xff0c;每個數代表坐標中的一個點 (i, ai) 。在坐標內畫 n 條垂直線&#xff0c;垂直線 i 的兩個端點分別為 (i, ai) 和 (i, 0)。找出其中的兩條線&#xff0c;使得它們與 x 軸共同構成的容器可以容納最多…

Github(2)-本地配置git

本地配置git1.注冊賬號2.安裝git工具3.配置git 賬號1.注冊賬號 github網頁注冊github賬戶 2.安裝git工具 本地安裝git工具 step1 查看是否安裝git git version step2 mac 安裝 brew install git step2 linux安裝 sudo apt-get install git 3.配置git 賬號 創建ssh key, 配置…

lua面向對象編程之點號與冒號的差異詳細比較

首先,先來一段在lua創建一個類與對象的代碼 Class {}Class.__index Classfunction Class:new(x,y)local temp {}setmetatable(temp, Class)temp.x xtemp.y yreturn tempendfunction Class:test()print(self.x,self.y)endobject Class.new(10,20)object:test() 猜一下會輸…

lua __index __newindex upvalue 示例

項目中有個公會對象&#xff0c;數據大部分存在data中&#xff0c;之前都是 u.data.point這樣訪問&#xff0c;太麻煩了。 于是通過設置__index 使之可以直接訪問屬性&#xff0c;u.point。 但是還是不能直接改屬性&#xff0c;u.point 4&#xff0c;所以再設置了__newindex…

leecode26 刪除排序數組中的重復項

給定一個排序數組&#xff0c;你需要在原地刪除重復出現的元素&#xff0c;使得每個元素只出現一次&#xff0c;返回移除后數組的新長度。 不要使用額外的數組空間&#xff0c;你必須在原地修改輸入數組并在使用 O(1) 額外空間的條件下完成。 示例 1: 給定數組 nums [1,1,2…

MachineLearning(6)-Daviad Silver強化學習課程脈絡整理

強化學習-Daviad Silver強化學習課程脈絡整理1.lecture1 introduction1.1 強化學習簡介1.2 強化學習類別1.3 強化學習的主要問題2.lecture2 Markov Decision Process2.1 MP,MRP,MDP2.2 Bellman Eqution--貝爾曼方程2.3 Bellman Eqution--貝爾曼期望方程2.4 最優策略2.5 最優值函…

lua的VS或者VC環境的搭建調試

安裝完LuaForWindows_v5.1.4 打開vs tools->options->projects->directories executable files 選項添加lua安裝以后的路徑,我的是 C:\Program Files\Lua\5.1 include files選項添加lua include路徑,我的是 C:\Program Files\Lua\5.1include library files 選項添…

leecode53 最大子序列和

給定一個整數數組 nums &#xff0c;找到一個具有最大和的連續子數組&#xff08;子數組最少包含一個元素&#xff09;&#xff0c;返回其最大和。 示例: 輸入: [-2,1,-3,4,-1,2,1,-5,4], 輸出: 6 解釋: 連續子數組 [4,-1,2,1] 的和最大&#xff0c;為 6。 思路&#xff1a;…

在頁游中LUA的應用(1)

通常,你希望在你的游戲開始的時候讀取一些信息,以配置你的游戲,這些信息通常都是放到一個文本文件中,在你的游戲啟動的時候,你需要打開這個文件,然后解析字符串,找到所需要的信息。 或許你認為這樣就足夠了,為什么還要使用Lua呢? 應用于“配置”這個目的,Lua提供給你…

Github(3)-本地文件管理

使用github 托管代碼簡單使用教程--本地文件管理1.基本概念2.本地文件管理2.1 git add2.2 git status2.3 git commit2.3 git log2.5 git reset --hard 版本回退2.6 git reflog2.7 git diff2.8 git checkout --file 工作區文件恢復2.9 git rm 刪除版本庫里的文件廖雪峰老師博文學…

linux 中阻塞與非阻塞 同步與異步

簡單點說: 阻塞就是干不完不準回來&#xff0c; 非阻塞就是你先干&#xff0c;我先看看有其他事沒有&#xff0c;完了告訴我一聲。 我們拿最常用的send和recv兩個函數來說吧。比如你調用send函數發送一定的Byte,在系統內部send做的工作其實只是把數據傳輸(Copy)到TCP/IP協議棧…