天天看點

幀同步_幀同步和狀态同步該怎麼選(下)

怎麼選

那麼依據上篇文章https://zhuanlan.zhihu.com/p/104932624的分析,我們可以總結一下,對于大部分遊戲來說,兩種同步方式都可以使用。但相比之下狀态同步适用型更廣,特别适合複雜度高,延遲要求高,玩家多的遊戲,例如FPS,MMO等等。幀同步相對适合小兵很多,玩家少且固定,單局時間短,對打擊感公平性要求高,追求一緻性的遊戲,例如格鬥,運動,RTS,卡牌,MOBA等。

從技術角度來說,幀同步有一些技術限制,大量玩家戰鬥,随時進入退出,難以預表現等,而狀态同步有更多的優化手段可以更好的降低延遲感。可以說用幀同步的一定能用狀态同步,但反過來不成立。

當然幀同步也有自己的優勢,實作成本相對簡單開發比較快速(一套邏輯不太需要聯調),在玩家較少小兵較多的情況下(由于隻同步事件而非狀态,是以網絡傳輸的資料和遊戲裡的對象數量無關)伺服器性能和帶寬開銷極低,甚至可以沒有伺服器(伺服器可以完全不跑戰鬥邏輯隻在需要反挂的時候跑),有點去中心化的意思。也非常适合一些單機遊戲改成聯網得遊戲,非常适合中小公司(之前開發的一個MOBA遊戲隻有一個伺服器同學)。

我們在選擇的時候需要綜合考慮遊戲類型,未來需求,戰鬥時長,遊戲模式,網絡帶寬,延遲響應,防作弊,開發成本周期和實力等因素來選用不同的同步方案,甚至混合使用。沒有最好的技術隻有最适合的技術。下面是一些在選擇時可以思考的一些參考問題:

幀同步_幀同步和狀态同步該怎麼選(下)

幀同步的難點

因為幀同步的一些限制并且使用的相對較少,最後再補充一些幀同步的優化方案和心得,可以參考:https://zhuanlan.zhihu.com/p/31618785這篇文章。

延遲方面:幀同步難以做預表現,是以對網絡和延遲要求更高,必須在網絡層上有更深度極緻的優化(一些狀态同步的遊戲優化不好開可以通過預表現蒙混過關)。

以下是之前嘗試過的一些優化手段:

1.首先要分析延遲是否有邏輯問題,比如我們一開始有部分延遲是因為邏輯在FixedUpdate裡執行,因為更新順序問題導緻用戶端相應操作慢一幀,解決之後有較大提升;

2.網絡層面極緻優化,使用自己開發的UDP,通過備援包和滑動視窗的方式保證可靠性降低延遲。備援包的個數依賴MTU并不固定,當然前提是每個幀操作的包也要極緻優化(方向操作分段,按位壓縮等)。此外用戶端上行可以允許丢包允許非可靠,用戶端關鍵操作立即發送(發送頻率比邏輯幀高),網絡多線程,多地多線部署比對等等;

3.控制發包頻率。非關鍵操作降低發送頻率,伺服器收到的操作會進行合并和優化,進行幀聚合,避免堆積。甚至可以有選擇的舍棄一些包;

4.用戶端可以進行一些預表現。比較好的做法邏輯層和變現層分離,用戶端表現層可以預表現一定的位移,然後通過航位預測算法逐漸內插補點到邏輯層的位置。對于幀同步來說解決平滑位移的基礎還是網絡層的極緻優化,然後再考慮平滑內插補點和預表現。

性能方面:幀同步需要每個用戶端都完整計算所有邏輯包括小兵AI等,特别是很多幀同步遊戲又是對幀率要求非常高非常穩定的,不能卡頓,也需要有更好的性能優化需求。

以下是之前嘗試過的一些優化手段:

1.正常的一些用戶端性能極緻優化,保證用戶端幀率穩定,可以參考https://zhuanlan.zhihu.com/p/29087888。例如多線程,分幀分攤,優化GC,預加載預編譯,優化算法,使用更優的平滑算法在渲染層內插補點,網絡卡頓時進行分擔等等;

2.幀同步有優勢的一些優化手段。邏輯幀和渲染幀分離,降低邏輯幀,一般來說MOBA遊戲邏輯隻需要15幀即可,在渲染幀較高時利用負載均衡拆分邏輯幀等消除毛刺等;

3.甚至一些複雜運算可以分布式計算或者伺服器計算,一人計算後同步給其他玩家。

開發效率:幀同步實作簡單但維護和查bug極難,對工具,開發素養,規範都有非常高的要求。特别事幀同步隻有一點不一緻就會導緻雙方不一緻(一個運算,一個錯誤導緻一些代碼跳過,更新順序等),并且往往是在第一時間表現不出來的,累積到一定時間之後才會爆發。

以下是之前嘗試過的一些優化手段:

1.程式架構上避免,開發時要求0warning0Error,詳盡的保護,邏輯層和表現層分離更新幀率不同,一些随機數,頂點數學庫等(可以參考https://zhuanlan.zhihu.com/p/30422277)底層庫也要區分開,有自動化的導表轉換工具等,防止邏輯層使用浮點數,不是固定随機等;

2.提供自動化的檢查工具。定期計算關鍵資料的hash值每幀校驗,表現層使用邏輯層庫會自動報錯等;

3.出錯時的排查工具。詳細的本地日志,不同步時每個人上傳伺服器前100幀的日志;錄像功能,記錄每個玩家同步操作資訊,同時出問題之後可以重複觸發跟蹤等

PS一些小誤區

  • 幀同步會受網絡最差的玩家影響,延遲依賴于最差玩家,一個人卡所有人都卡:這是早期的P2P技術導緻的,一個玩家要等所有玩家的操作都到了才到。最早Doom就有這個問題,如果使用Packet Server(伺服器或者主機)就可以避免這個問題,卡的玩家隻會影響他自己,就是樂觀幀方案
  • 狀态同步伺服器需要跑邏輯:狀态同步也可以使用用戶端之間的狀态同步伺服器隻轉發,幀同步也可以伺服器跑完整邏輯(實時跑和結算後快速演算)
  • 幀同步或者狀态同步隻能選一個:針對不同的需要也有項目同時使用幀同步和狀态同步兩種做法例如夢三國等,平時使用幀同步線下比賽的時候針對比賽玩家使用狀态同步解決全圖挂的問題
  • 幀同步難反作弊:除了全圖挂等(用戶端有完整資訊)更容易反外挂,王者榮耀反外挂做的就很好
  • MOBA适合幀同步:Dota2和LOL都是狀态同步的

繼續閱讀