MOBA戰斗服務器設計思路


MOBA作為競技類的游戲,游戲中實時高精度同步,或者又說延遲容錯率的要求還算是比較高的一種。

 

如何做到這種同步機制呢?

常用的同步機制有兩種類型:幀同步 / 指令同步

 

何謂幀同步?

保證雙方客戶端邏輯運算結果高度一致的情況下,服務器只做消息轉發的方式來驅動游戲的一種模式。

即:服務器沒有具體邏輯 只做幀數據的下發 / 保存 / 檢測。

  客戶端持有游戲的所有戰斗邏輯 / 戰斗數據。根據每個客戶端的邏輯結果相同的機制來保證游戲內容的一致性。

 

何為指令同步?

是一種以服務器邏輯為標准來驅動游戲的一種模式。大多數時候客戶端只做表現 / 和發送用戶指令。

即:服務端持有游戲所有邏輯,對游戲擁有絕對的權力。

  客戶端主要接收用戶的指令 提交到服務器,收到服務器處理結果進行表現。

 

這兩種模式的一些比較?

幀同步:

  1.對開發的要求非常高,且測試過程非常艱難。

  2.而且對網絡的消耗也要求比較高。並且對斷線重連的支持非常不友好,也不支持中途加入游戲操作。

  3.幀同步確實能保證游戲的高度一致性。

  4.在架構完善后 對開發者很友好。

  5.服務端不用處理游戲的具體邏輯。

 

指令同步:

  1.對開發的要求不高,測試過程也比較友好。

  2.對網絡的消耗也可以做到最低,把控性也高,可以給玩家做延遲補償等,對斷線重連 / 中途加入也有非常好的支持。

  3.游戲的一致性支持也很好。只是比起幀同步要處理的細節更多。

  4.從開發的線條來說,剛開始要做結構,后面就是要完成具體邏輯,雙向開發,比起幀同步成本還是比較高的。

  5.服務端客戶端都需要一套游戲的具體邏輯進行雙向校驗。

 

最近在做一個moba類的項目。主要負責戰斗服務器這塊,因為之前做過一段時間的 IO 游戲,最早也做過 RPG 游戲,對同步這塊一直也沒總結過,所以特開此頁進行總結。

 

本次用到的一些技術體系和點具體內容:

  1.【語言選擇】語言選擇決定了開發的效率,后期維護的成本。選擇一門適合當前這種應用的語言應該是開發的第一步了。本次開發我們選擇了 Golang。因為 Golang 的支持庫很完善,語法簡潔,對並發的支持性好。開發效率可以說非常高了。

 

  2.【 UDP + KCP 】通訊方式的轉變,最早的時候做這種同步的 RPG 基本也就是 TCP 協議了。在最近做 IO 的時候,領導提出了一種更好的方式 UDP + KCP 並且針對於 TCP 進行了測試,實際得到的性能和傳輸效率確實比 TCP 要高出很多,唯有一點就是會增加網絡傳輸的數據量。事實證明這是一種拿數據流量換性能的模式,但在當下的網絡環境里幾乎可以忽略不計。

 

  3.【指令同步 + 邏輯幀】指令同步中使用邏輯幀的模式,之所以幀同步能保證游戲的高度一致,是因為它確定了消息的發送開始位置,也保證了玩家執行消息的順序以及邏輯結果的一致性。而這里的邏輯幀概念也相差不大,服務器緩存一個邏輯時間的指令消息,也就是一次性處理一個邏輯幀的指令消息,然后下發所有結果。這樣能保證客戶端在基於邏輯幀消息上的執行結果相同,也提高了一致性,在忽略延遲偏差的情況下 它們的執行結果也應該是相同的。

 

  4.【 TCP + UDP 】連接模式組合,因為使用了 UDP + KCP 來提升網絡中的傳輸效率,以保證客戶端在相差不大的時間戳里接收到消息。但 UDP 是一種無連接協議,它以報文的方式進行傳輸,並且存在丟包的幾率。所以考慮到以上 加入 TCP 連接來做 PING / PONG 這種校驗連接正確性的操作,同時也用在一些不頻繁的消息上,以減輕數據傳輸量以及丟包的幾率。

 

暫時記錄了這些 比較細的東西我之后會挑選一些接觸到的來記錄,然后形成一個服務器開發的類別吧。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM