目錄
數據同步
通過比較來看狀態同步和幀同步
狀態同步
幀同步?
幀同步實現需要的條件
兩者相比較
數據同步
在聯機游戲中,我的操作和數據要同步給同一局游戲中其他所有玩家,其他玩家的操作和數據也會同步給我。這叫做數據同步,目前數據同步的方式則有幀同步和狀態同步。
狀態同步:將操作發送給服務端,服務端對操作進行運算并下發狀態,客戶端接收并播放狀態
- 發操作
- 收狀態
幀同步:將操作發送給服務端,服務器不進行任何運算把操作傳給客戶端,客戶端在本地進行運算
- 發操作
- 收操作
適合幀同步的游戲:
- 網絡波動比較大
- 追求即時反饋:FPS、MOBA、SPT
- 控制大量游戲單位:RTS??
通過比較來看狀態同步和幀同步
拿小編熟悉的紅色警戒舉例:假如我和你在聯機對戰,你要控制100個小兵移動到我的基地。
狀態同步
- 客戶端要將被選中的100個小兵信息和目標點發送給服務器
- 服務器通過計算100個小兵的移動速度和100個小兵當前位置信息定時返回給我倆的客戶端
- 直到100個小兵到達我的基地。
由此可見(控制大量游戲單位)的這種游戲如果采用狀態同步會給服務器造成多大壓力
幀同步?
同樣場景如果采用幀同步:
- 客戶端將幀號(幀號表明當前游戲進行到第幾副畫面了)、100個小兵的信息、目標點發送給服務器。
- 服務器一次性返回給我倆的客戶端幀號、100個小兵的信息、目標點。
- 我倆各自的客戶端通過同步幀號進行本地運算處理小兵當前的位置信息,直到他們達到目標點。
幀同步實現需要的條件
一套完整的幀同步游戲框架要實現什么?
- 可靠的UDP:實現 時序性 、 重傳機制 、 應答機制 、 消除最小延遲
- 確定性的數學和物理運算庫:浮點數在電腦運算存在不精確性? ——? 如何解決:取整計算、容許小概率誤差、邏輯表現分離
- 斷線重連:大家玩王者如果卡了或者斷線,恢復之后大家會看到像用倍速看電影那樣的畫面,這是通過追幀的方式重連游戲
- 比賽回放:服務器記錄關鍵幀;下發客戶端進行重放
- 反作弊:重演、仲裁;一局游戲有五個人,那他們提交到服務器的操作記錄是相同的,如果有人記錄不相同說明存在作弊現象
- 避免等待