天天看點

幀鎖定算法解決遊戲同步

早期 RTS,XBOX360 LIVE遊戲常用同步政策,如何才能像單機遊戲一樣編寫網遊??

算法概念

該算法普遍要求網速RTT要在100ms以内,一般人數不超過8人,在這樣的情況下,可以像單機遊戲一樣編寫網絡遊戲。所有用戶端任意時刻邏輯都是統一的,缺點是一個人卡機,所有人等待。

1.用戶端定時(比如每五幀)上傳控制資訊。

2.伺服器收到所有控制資訊後廣播給所有客戶。

3.用戶端用伺服器發來的更新消息中的控制資訊進行遊戲。

4.如果用戶端進行到下一個關鍵幀(5幀後)時沒有收到伺服器的更新消息則等待。

5.如果用戶端進行到下一個關鍵幀時已經接收到了伺服器的更新消息,則将上面的資料用于遊戲,并采集目前滑鼠鍵盤輸入發送給伺服器,同時繼續進行下去。

6.服務端采集到所有資料後再次發送下一個關鍵幀更新消息。

這個等待關鍵幀更新資料的過程稱為“幀鎖定”

應用案例:大部分RTS遊戲,街霸II(xbox360),Callus模拟器。

算法流程

用戶端邏輯:

1.        判斷目前幀F是否關鍵幀K1:如果不是跳轉(7)。

2.        如果是關鍵幀,則察看有沒有K1的UPDATE資料,如果沒有的話重複2等待。

3.        采集目前K1的輸入作為CTRL資料與K1編号一起發送給伺服器

4.        從UPDATE K1中得到下一個關鍵幀的号碼K2以及到下一個關鍵幀之間的輸入資料I。

5.        從這個關鍵幀到下 一個關鍵幀K2之間的虛拟輸入都用I。

6.        令K1 = K2。

7.        執行該幀邏輯

8.        跳轉(1)

服務端邏輯:

1.        收集所有用戶端本關鍵幀K1的CTRL資料(Ctrl-K)等待知道收集完成所有的CTRL-K。

2.        根據所有CTRL-K,計算下一個關鍵幀K2的Update,計算再下一個關鍵幀的編号K3。

3.        将Update發送給所有用戶端

4.        令K1=K2

5.        跳轉(1)

幀鎖定算法解決遊戲同步

伺服器根據所有用戶端的最大RTT,平滑計算下一個關鍵幀的編号,讓延遲根據網絡情況自動調整。

算法示範

我根據該算法将街機模拟器修改出了一個可用于多人對戰的版本,早期有一個叫做kaillera的東西,可以幫助模拟器實作多人聯機,但是并沒有作幀鎖定,隻是簡單将鍵盤消息進行收集廣播而已,後來Capcom在PSP和360上都出過街霸的聯網版本,但是聯網效果不理想。這個算法其實區域網路有細就經常使用了,隻是近年來公網速度提高,很容易找到RTT<50ms的伺服器,是以根據上述算法,在平均RTT=100ms(操作靈敏度1/10秒),情況下,保證自動計算關鍵幀适應各種網絡條件後,就能夠像編寫單機遊戲一樣開發網遊,而不需狀态上作複雜的位置/狀态同步。

幀鎖定算法解決遊戲同步

從上圖的示範中可以看到,兩個模拟器程序都在運作1941這個遊戲,兩邊用戶端使用了該算法,将邏輯統一在一個整體中。

幀鎖定算法解決遊戲同步

最後這張圖是運作KOF99的效果圖,兩邊完美同步。

繼續閱讀