網路遊戲的數據包通信協議定義有哪些資料可以參考?

譬如:

遊戲的登陸協議通常是如何設計的?

大型3dMMORPG的副本都有那些類型的數據包?

幾個人聯機的2d小遊戲如何同步玩家的位置和動作?

等等...


謝邀,遊戲中的通信協議和傳統的協議沒有太多不一樣的地方,只不過遊戲會有一些習慣做法。

按照遊戲需求來設計協議就好了。如果沒經驗不清楚具體場景,以下做個拋磚引玉:

  • 遊戲登錄
    1. 初始化

      客戶端通常會在這一步先把一些環境參數傳遞給服務端,如用戶ID、Token(接入第三方運營商的可能會有)、時間截等。
    2. 登陸

      向遊戲伺服器發起登陸請求,用戶名,Token, 此時可能會附帶要登錄的區/服ID.
  • 遊戲副本
    1. 請求進入副本

      客戶端攜帶需要進入的副本ID,向服務端請求進入。服務端檢查玩家是否符合進入條件,符合的情況下會為副本分配內存,之後可以直接走一般遊戲場景切換協議。
    2. 副本結束通知

      會根據不同類型的遊戲副本設計,有些是玩家主動退出的,有些是因為副本的失敗條件服務端主動強制退出的。
  • 玩家行為同步

    1. 位置同步

      如果是那種允許滑鼠指定目的地同時也允許方向鍵操作的遊戲,可考慮設計兩種同步協議。

      滑鼠指定移動目標並且由客戶端尋路的情況下,由伺服器同步給周圍的其它玩家。其它玩家的客戶端執行尋路操作;如果是服務端尋路則同步移動的路徑給客戶端。

      使用方向鍵/手柄的情況下則在不同的時機發送移動請求。如從待機到開始移動時、改變移動方向時、釋放移動按鍵時。這種情況下如果服務端沒有地形信息,並且正在移動的玩家遇到網路延遲,發出了開始移動的請求卻沒成功發出結束移動的請求,就會容易出現跑到地圖外面的情況。改善的方法是在關鍵幀進行同步請求。
    2. 行為同步

      玩家執行某個可視動作的時候向周圍的人同步你的行為。如發起某個技能時,向服務端請求你要發起的技能ID,服務端檢查魔法值、冷卻時間等前置條件,成功後同步給周圍所有人,不成功則返回錯誤碼。

    3. 玩家視野

      受限於負載因素,遊戲中通常會劃分一個邏輯上的視野。比如說角色在移動的情況下,只有以它為中心的N*N個單位的區域內的玩家才可以收到同步信息。而此範圍外的玩家則不會收到協議(不同解析度下這個範圍的大小可能不同)。

關於同步的參考資料見樓上大神 @韋易笑 的博客:

  • 幀間同步模式: 幀鎖定同步演算法
  • 玩法規避模式:網路遊戲同步法則
  • 預測插值模式:影子跟隨演算法
  • 提高傳輸速度: 快速可靠傳輸協議

另外的建議,

遊戲需求一旦確定之後可以在腦海中或者通過畫流程圖的方式把遊戲玩法過一遍。一旦一個遊戲玩法的步驟理清了之後,再設計通信協議就很簡單了。


說實話,你應該找一套開源的遊戲代碼看看,比如:

SmartFoxServer - java 的遊戲伺服器

Mangos - 魔獸世界私服開源版

MUDOS - MMO鼻祖。

還有網上泄漏的各大公司的遊戲源代碼。

-----------------

看你提的問題,你是完全不知道這塊該怎麼做,即便跟你說清楚了,我相信後面你還會有更多問題,上面說的,選至少兩套看看:

1. 把代碼結構流程圖畫出來

2. 把大部分消息整理理清楚

3. 把數據存儲這一塊理清楚

4. 把各種邊際條件都過一遍

相信你的問題一定迎刃而解。


問題描述的不是很清楚,大概是因為題主對遊戲服務這塊沒太多概念的原因

通迅協議可以使用protobuf

至於傳什麼類型的數據,當然是根據你遊戲的設計來,需要顯示使用到哪些數據就傳遞哪些

同步演算法

憤怒的泡麵 說的很清楚了

遊戲的登陸協議通常是如何設計的?

簡單來講是把登陸驗證和遊戲服邏輯拆分開,提供登陸介面,驗證成功後拿著驗證的KEY 再去連接遊戲服


其實這些協議的設計更在於你最低需要哪些客戶端數據來保證多人的一個同步和對客戶端的一個控制 有點類似於rpc這樣的去把你需要的數據拿到做一個業務邏輯來達到目的 具體理論的說法樓上各位大佬都說了不少 協議具體設計無非對你需要的數據進行一個序列化 接收端反序列化然後調用業務層


推薦閱讀:

如何禁止自己的開源項目的衍生品使用GPL-like(LGPL除外)協議?
.Net 新一代編譯器 Roslyn 會帶來怎樣的影響?
有哪些有趣的開源機器人項目?
把程序做成開源的,對程序作者有什麼好處呢?
你在使用Android開源項目的過程中都遇到過哪些坑?

TAG:網路遊戲 | 遊戲設計 | 編程 | 開源 | 通信協議 |