天天看點

狀态同步與幀同步

現代多人遊戲中,多個用戶端之間的通訊大多以同步多方狀态為主要目标,為了實作這一目标,主要有兩個技術方向:

狀态同步

幀同步

狀态同步

狀态同步簡單來說就是同步遊戲中的各種狀态,當用戶端發送遊戲動作到伺服器,伺服器接收到之後,通過計算遊戲行為的結果,然後廣播下發給用戶端遊戲中的各種狀态資料。用戶端接收到狀态資料後顯示内容。這種做法類似于各個用戶端都在遠端操作伺服器上的軟體。例如最高的mud,以及日後大量的國産網遊,特别是回合制遊戲,大多采用這種方式。

狀态同步的流程:

用戶端上傳操作到伺服器

伺服器收到後計算遊戲行為的結果(如技能邏輯、戰鬥計算等)

伺服器以廣播的方式下發遊戲中各種狀态

用戶端收到狀态後更新本地狀态(如動作狀态、Buff狀态、位置等)

為了給遊戲玩家更好的體驗,減少同步的資料量,用戶端也會做很多的本地運算,減少伺服器同步的頻率以及資料量。

狀态同步其實是一種不嚴謹的同步,它的思想中不同玩家螢幕上的一緻性的表現并不是重要名額,隻要每次操作的結果相同即可。是以狀态同步對網絡延遲的要求并不高。例如:RPG遊戲中200~300ms的延遲對使用者來說是可以接受的,但在RTS(即時戰略)遊戲中50ms的延遲卻會很受傷。

幀同步

幀同步是RTS遊戲經常采用的一種同步技術,狀态同步中資料量會随着需要同步的機關數量增長,而對于RTS來講動不動就是幾百個機關可以被操作,如果這些都需要同步的話,資料量是不能被接受的,是以幀同步不同步狀态,之同步操作。例如遊戲中同步玩家的操作指令,操作指令包含目前的幀索引。

簡單來說,用戶端發送遊戲動作到伺服器,伺服器接收并彙總,然後直接轉發給所有用戶端,或者用戶端直接通過P2P技術發送。用戶端根據收到的遊戲動作來做運算和顯示。這種做法等于用戶端之間互相遠端控制其他用戶端上的遊戲軟體。早期的ipx網絡遊戲,例如紅色警戒、帝國時代、星際争霸,以及大量支援網絡連線雙打遊戲機模拟機,都是采用這種方式。

那些遊戲需要使用幀同步呢?

多人實時對戰遊戲

遊戲中需要戰鬥回放功能

遊戲中需要加速功能

需要伺服器同步邏輯校驗防止作弊

幀同步的流程

同步随機種子:遊戲中設計随機數的使用,通過同步随機數種子可以保持随機數的一緻性。

用戶端上傳操作指令給伺服器,操作指令包含遊戲操作和目前幀索引。

遊戲廣播所有用戶端的操作,如果沒有操作也要廣播空指令來驅動遊戲幀前進。

狀态同步與幀同步

幀同步

幀同步主要依賴用戶端的能力,伺服器僅僅是做一個轉發,甚至用戶端可以無需伺服器,通過P2P方式來轉發資料。由于隻是轉發遊戲的行為,是以廣播的資料量比狀态同步要小很多。非常适合遊戲行為非常頻繁的動作遊戲,諸如飛行射擊、FPS、RTS(即時戰略)。

狀态同步由于要把整個遊戲的狀态都廣播下去,如果遊戲中的對象特别多,比如滿屏的子彈、怪物,那麼要廣播的資料量就會很大,這個時候幀同步的優勢就比較明顯,因為不管有多少”機器控制的角色“,僅僅需要廣播玩家角色有關的操作即可。反過來,如果遊戲中有大量玩家同時聚集,那麼幀同步和狀态同步的差異就不太明顯。反而狀态同步能得到更多安全性,因為遊戲運算在伺服器上,比較容易防止外挂。

簡單來說,幀同步技術最要的概念是”相同的輸入 + 相同的時機 = 相同的顯示“。也就是說,遊戲接收來自網絡的多個用戶端的操作,如果這些操作在各個用戶端上都是一樣的,那麼多個用戶端的顯示也就是一樣的,進而帶來了”同步“的效果。在這種情況下,各個用戶端的運算要絕對一緻,不能依賴諸如本地時間、本地随機等”輸入“,而要一切以網絡來的資料為主。

幀同步

因為幀同步的特性,是以很容易做出戰鬥回放,即伺服器記錄所有操作,用戶端請求到操作檔案再執行一次。幀同步的特性導緻用戶端的邏輯實作和表現實作必須完全分離。

幀同步的目的在于消除網絡波動性帶給玩家的卡頓以及忽快忽慢的不良體驗。

狀态同步與幀同步

網絡波動的平滑處理

狀态同步和幀同步的比較和選擇

對于機關比較多的即時政策遊戲,幀同步是很好的選擇。相反的,如果玩家比較多,狀态同步則更加合适,因為安全性更高。一般大型MMOARPG都采用狀态同步,由于狀态同步采用C/S架構,所有狀态由伺服器來控制,安全性比較高,但流量比較大。幀同步采用的是囚徒模式,所有C端強制采用一個邏輯幀率,進而保證輸出一緻,其特點是流量小,安全性較差。

囚徒模式又叫鎖步模式,就是把所有參與對戰的用戶端看成排成一列的囚犯,這些囚犯們的左腳都被鎖鍊給連起來,如果要往前走,就隻能同時邁步,如果其中某個人走快了或走慢了,都回讓整隊人停下來。

狀态同步與幀同步

狀态同步和幀同步的比較

幀同步的基本原理

幀同步是一種對同步源進行像素級同步顯示的處理技術,對于網絡上的多個接入者,一個信号将會通過主機同步發送給其他人,并同步顯示在各個終端上。同步信号可以是每幀的像素資料,也可以是影響資料變化的關鍵事件資訊。

幀同步在網絡遊戲應用中的設計有别于傳統的MMORPG遊戲,因為可以承載大量的背景計算,實作類單機的效果,是以可以在射擊類、飛行類遊戲中實作彈幕計算或格鬥類的高精度打擊效果。

什麼叫做幀同步呢?伺服器收集用戶端手機發送過來的操作,然後在特定的時間(收集完成之後),再廣播發送給每個用戶端。用戶端根據接收到的輸入,進行同樣的邏輯處理,最終得到同樣的結果的過程。在實作上,一般都是以伺服器按固定的幀率,來搜集每個用戶端的輸入,然後把這些輸入廣播給所有用戶端。由于每個操作指令到達所有用戶端的時間(幀)都是一樣的,是以每個用戶端運算的結果也是一樣的,也就是同樣的輸入就會得到同樣的結果。

這就好像是玩家通過網絡将操作搖桿連接配接到你的手機,這種同步方案是傳統單機區域網路遊戲中最常見的。

幀同步

幀同步模型最大的優點在于強一緻性,每個用戶端的表現是完全一樣的,非常适合高度要求操作技巧的遊戲。由于廣播的僅僅是玩家的操作,是以資料量很少。不管遊戲中的角色數量、狀态數量有多大多複雜,都不會影響廣播的資料量。

幀同步模型最大的缺點是對所有玩家的延遲都有要求,一般來說要求在50毫秒以内,如果有一個用戶端網絡卡住了,所有用戶端都要停下來等待。

另外在幀同步模式中,資料同步的頻率較高,網絡延遲越小越好。由于TCP的滑動視窗機制和重傳機制,導緻延時機制,導緻延時無法控制。是以幀同步一般采用UDP進行網絡傳輸,但UDP又會衍生出可靠性問題,對于用戶端,如果某些UDP包沒有收到,就會出現丢幀的情況。

幀同步技術原理

用戶端A的操作A1與用戶端B的操作B1,共同封裝成OperateCmd資料發送給PVP伺服器,PVP伺服器每66毫秒産生一個邏輯祯,在該桢所在時間段内,收到A1和B1後,生成一個Frame資料塊,在該幀時間結束時,将Frame發送給用戶端A和B。Frame資料塊内有該幀的幀号,用戶端A和B接收到Frame資料後,便知道該幀内,用戶端A和用戶端B都做了什麼操作。然後根據接收到的消息A1和B1進行遊戲表現,最終呈現給玩家A和B的結果是一緻性的,進而實作用戶端A和B的資料同步。

狀态同步與幀同步

幀同步

幀同步既然是在特定時間發送,也就是說每隔一段時間收集使用者操作指令,那麼要間隔多久内。例如每隔一段時間搜尋使用者的操作。此時,如果時間太快則網絡速率達不到要求,如果時間太長則使用者操作不流程。哪裡多少才比較合适呢?根據統計玩家至少要在50ms100ms可以完成一次,一般維持到1520次左右會比較安全。

繼續閱讀