幀同步

幀同步在服務端採用房間模式,玩家在對戰時創建對應房間並將玩家加入該房間進行對戰。

對於在線遊戲玩家數超過單服務器負載上限時可以多開房間服,這樣可以有效分散帶寬壓力。

為了更好的遊戲體驗一般會對進行對戰遊戲匹配進入合適的房間服

通信方式

項目同時支持 TCP, UDP(KCP) 模式,

TCP問題

1)遇到網路不穩定掉包或是封包出錯時重發成本高

UDP 問題

1)掉包跟封包順序問題

2)手動封裝上層

3) 服務端需要多發封包

目前KCP在打包出現問題,暫時沒有使用KCP,應該是 lib 沒有對應到正確版本的問題

幀同步

幀同步保證所有客戶端在每一個frame執行後的結果是一致的,但考慮不同客戶端延遲不同使用嚴格模式必須等待所有客戶端消息收到才能廣播,一個客戶端卡會造成所有用戶都卡頓,在這我們使用樂觀鎖模式。

樂觀模式:

服務端每一個turn(frame)無須等待客戶端消息,直接將當前收集到的消息廣播給客戶端,因此卡的客戶端自己會顯示卡頓或是無效,但不會影響到其他用戶

邏輯計算要點

在邏輯運算中必須保證多端之間的運算結果是一致的,因此必須保證以下重點

1) 使用隨機必須保證執行結果一致

每一個房間分配一個隨機種子,根據種子計算的到結果一致

2) 禁止使用float進行計算

自行實現float class

3) 客戶端刷新 entity 不可以有順序性問題,譬如判斷 entity.UserId == MyUserId 造成運算順序差異

邏輯與渲染分離

在遊戲運行時必須把數據計算邏輯跟顯示邏輯分開,

預測與回滾

移動預測:根據角色所在位置點判斷目前frame的預測移動,

技能預測:不做技能預測,這個預測成功率很低會造成回滾概率上揚

客戶端卡頓與網路抖動

使用命令緩衝區來解決,將服務端同步FrameMessage保存到命令緩衝區,客戶端每一幀去讀取出來執行,而不是直接執行服務端下發消息,可以有效避免網路抖動問題,但緩衝區越大則延遲感越明顯。

插植算法

將服務端下發的移動消息計算結果採用平滑移動方式去表現,可以彌補在網路卡頓時出現角色移動跳躍的問題

延遲補償

CS的技術,用來代償網路延遲玩家感受,由於我們的是放炸彈到轟炸有時間遞延,所以不需要做這個功能。

Last updated