網絡遊戲服務器中事件和狀態

###網絡遊戲中傳遞的報文,主要分爲兩種:服務器

事件報文網絡

狀態報文對象

###報文的實現遊戲

事件須要保證順序,可靠,例如玩家使用某個技能,而事件一般能夠採用相似 RPC的方式來實現,事件報文的傳遞,採用相似於TCP的協議來進行。事件

狀態報文只須要保證最終的狀態一致,例如玩家的HP,位置等數據,所以能夠採用UDP傳輸,只須要保證最終狀態被同步一致便可。字符串

一般某個事件發生,會影響狀態,例如玩家命中目標這個事件,會影響目標HP狀態的變化,一般事件和狀態的同步分離進行。同步

而在某個事件發生的時候,須要使用一些玩家的狀態參數,例如使用技能時刻,玩家所在的位置和朝向這個狀態數據是須要的。io

能夠將遊戲按照服務器離散幀來劃分,例如服務器50ms一幀,這樣只須要知道事件執行所在的遊戲幀,而客戶端知道在該幀時刻,玩家的狀態數據,這樣就減小了事件命令須要同步的數據了,可是增長了客戶端存儲的數據量,客戶端須要存儲多幀的玩家狀態。module

同時在命令和狀態同步,須要爲數據增長相應的服務器幀編號。請求

####報文的格式能夠是: length 報文長度

moduleId, msgId 報文的模塊和msg編號

flowId 報文的流ID

frameId 報文的服務器幀ID

body 報文體數據

其中flowId 是爲了實現 請求響應模式;

而frameId 即爲服務器幀id,通常只有服務器對客戶端發送。

能夠縮減固定包頭的長度,將flowId 放置到body協議內,使用protobuf的 optional 字段,對有須要的報文才使用 flowId;

moduleId, msgId, 對於網絡協議,能夠每一個協議定義一個protobuff message對象,這樣須要使用 moduleId和msgId來區分不一樣協議;

也能夠在 body區域的 protobuf使用一個大一統的pb message,在這個message 頭部定義一個字符串,使用字符串來區分不一樣的協議,而message後續部分爲各類數據。

相關文章
相關標籤/搜索