###網絡遊戲中傳遞的報文,主要分爲兩種:服務器
事件報文網絡
狀態報文對象
###報文的實現遊戲
事件須要保證順序,可靠,例如玩家使用某個技能,而事件一般能夠採用相似 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後續部分爲各類數據。