天天看點

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

這是一篇拖延了2年多的文章…2017年10月份開始寫的,直到這次過年才寫完。。。

前言

随着王者榮耀的崛起,使用幀同步(Lockstep)的遊戲也越來越多,關于幀同步和狀态同步的讨論争論也有不少,那麼到底該選哪種同步機制呢?兩種機制都使用過,各有優缺點也都踩過不少坑,這裡對幀同步和狀态同步進行一下總結和讨論。

首先需要說明, 這裡的幀同步其實是指

LockStep

是指伺服器按幀轉發用戶端的操作,用戶端進行确定性運算和一緻性模拟

(同步操作兩邊用戶端通過完全一緻的操作計算出完全一緻的狀态)。

每幀同步狀态這裡也認為是狀态同步

這兩種同步機制都是為了達到即時同步不同用戶端的狀态的目的,幀同步需要參與者去管理和維護其自有的那份拷貝,通過施加一緻的邏輯來推動所有的狀态去同步地更新;狀态同步則随着時間的流逝不斷地比較和發送最小的狀态變化和差異。

我們先看一些使用這兩種同步機制的案例:
幀同步_幀同步和狀态同步該怎麼選(上)

可以看到大部分類型遊戲,兩種同步方式都可以使用,但

絕大部分遊戲使用狀态同步,大量玩家戰鬥的遊戲隻能使用狀态同步

網絡模型發展曆程

下面簡單介紹一下網絡同步模型的發展。我們可以從DOOM/QUAKE I/II/III的演化來看到同步模型的發展。可以參考

DOOM3網絡模型的演化與網絡架構

這篇文章。同步方式的曆程大概是幀同步(Lockstep),快照同步(Snapshot synchronization),狀态同步(State synchronization),目前絕大部分多人遊戲都使用狀态同步。

P2P 模型 (DOOM)

DOOM (1994) 的網絡模型是基于P2P的幀同步。有着幀同步的各種問題,後面會介紹。并且因為沒有主機,每個玩家直連其他所有玩家任何一個人卡所有人都卡,是一個非常古老的同步技術。

Packet Server (包的簡單中繼)

這個模型在原版 DOOM 的基礎上增加了一個 Packet Server,負責轉發所有的 tick command。玩家不再直連其他所有玩家,而是連到這個伺服器 (某個玩家機器上) 以擷取最新的狀态。這樣改進後,同步量降低了,一個玩家卡隻會自己卡,當然如果伺服器卡就會卡。

體感可以參考魔獸争霸

,主機卡了所有人都會卡。同時如果主機是伺服器可以避免絕大部分作弊情況,但如果主機是玩家主機作弊就沒辦法了。幀同步的其他缺陷也沒有得到解決。

Client Server (Quake I/II/III)CS架構

Quake I/II/III 實作了比較典型的 C/S 架構 (1996)。這個模型中

伺服器負責所有的邏輯判斷

,用戶端

本質上隻是一個渲染終端

。玩家把自己的操作和輸入發送給伺服器,收到一個實體清單用于渲染。伺服器把壓縮後的快照按照固定頻率發送用戶端 用戶端使用這些快照來插值或推導出平滑連貫的體驗 。

這時候同步機制已經變成了伺服器同步操作用戶端計算邏輯,伺服器同步狀态的狀态同步了,

解決了幀同步的大部分問題

。但

Quake I

還做的比較簡單,和幀同步不同的是把所有邏輯相關的放在了伺服器,用戶端在發送操作之後就要等伺服器同步狀态。延遲問題還是沒有得到解決,同時因為要同步所有狀态資訊帶寬占用很高,當遊戲越複雜帶寬就越高。

Quake III

做了進一步的優化。用戶端不是等待伺服器而是

會預測可能的遊戲狀态

,預測狀态和伺服器端邏輯使用一套代碼,如果伺服器和用戶端确實不一緻,則伺服器為準強同步。

預測也是降低延遲感的一個重要方式,對延遲要求很高的FPS特别重要。并且狀态同步伺服器永遠所有資訊也能允許玩家中途加入和退出了。但同樣的開發

複雜度也變的更高了

,代碼需要區分伺服器和用戶端,

需要邏輯和表現分離

,需要處理一些聯調的問題(伺服器和用戶端處理時間不一緻,預表現內插補點問題,強同步問題)。

半條命(基于Quake引擎開發)在這個基礎上引入了一種

延遲補償 (lag compensation)

,當玩家向某個目标 (若幹毫秒前的狀态) 射擊時,做實際檢測的伺服器會采用該目标若幹毫秒前的狀态來檢驗是否擊中。這麼做需要伺服器把之前一小段時間的狀态持續地儲存下來,這樣不僅增加了實作複雜度,而且導緻了某種程度的不一緻性。延時高的玩家反而更容易因為補償獲得更有利的判斷,嚴重影響遊戲體驗 。這種補償隻能對目标的位置復原,而所有其他環境狀态的改變卻已無法倒退,這也會影響實際的體驗。

Quake III

裡對同步資訊做了進一步壓縮和優化,

隻有在 PVS 内的實體才會被同步狀态

,而且被同步的是

壓縮後

的與上一次同步的

內插補點

(delta compressed relative to the entity states from a previous snapshot,Delta技術) 。

可以看到當玩家比較少的時候,幀同步隻需要同步操作,流量會比較小,非常适合同屏大量小兵的情況(小兵不需要同步任何資訊)

,極省帶寬。但是當玩家多的時候每個玩家的操作都要互相同步,帶寬就會

指數增長

,無法優化,反而狀态同步可以通過分區域的方式同步

支援更多的玩家

Quake III

不同,

Doom III

的伺服器和用戶端使用同一份代碼來更新/預測實體的狀态,這樣不用擔心伺服器和用戶端邏輯的互相幹擾,同時用戶端和伺服器也一相同的邏輯幀率運作60fps,每幀用戶端上傳玩家輸入,伺服器按固定間隔同步PVS範圍内的狀态快照,也可以了解為

按幀同步的狀态同步

Doom III在網絡上使用UDP,自己通過備援包和滑動視窗保證伺服器消息不丢失和有序并且允許用戶端上行丢包,在弱網情況下比TCP延遲更低,不需要TimeOut機制。

兩者的優缺點對比

那麼我們再來對比一下幀同步和狀态各自的優缺點:

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

繼續閱讀