遊戲幀同步的流程與實現

2021-10-21 23:58:18 字數 3381 閱讀 9655

大綱

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

狀態同步

狀態同步簡單來說就是同步遊戲中的各種狀態,當客戶端傳送遊戲動作到伺服器,伺服器接收到之後,通過計算遊戲行為的結果,然後廣播下發給客戶端遊戲中的各種狀態資料。客戶端接收到狀態資料後顯示內容。這種做法類似於各個客戶端都在遠端操作伺服器上的軟體。例如最高的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次左右會比較安全。

30人點贊

game

遊戲中幀同步與狀態同步

幀同步 什麼是幀同步 幀同步常被rts 即時戰略 遊戲常採用。在遊戲中同步的是玩家的操作指令,操作指令包含當前的幀索引。一般的流程是客戶端上傳操作到伺服器,伺服器收到後並不計算遊戲行為,而是 到所有客戶端。這裡最重要的概念就是 相同的輸入 相同的時機 相同的輸出。實現幀同步的流程一般是 同步隨機數種...

捕魚遊戲幀同步方案

設計原則 玩家在按下的時候,就會看到子彈射出去。這種設計注定了,玩家會收到其他玩家在之前時間射出的子彈 優先保證自己的準確性,其他玩家的準確性可惜部分犧牲 同步方案 伺服器按照固定頻率下發同步幀,假定每秒10幀。每幀資料報括幀號 4個玩家的炮台發射角度,沒有發射則發 90度表示空。通常客戶端的邏輯幀...

遊戲幀同步學習筆記

三 幀同步 四 狀態同步與幀同步對比 現代多人遊戲中,多個客戶端之間的通訊大多以同步多方狀態為主要目標,為了實現這一目標,主要有兩個技術方向 狀態同步 幀同步。1 什麼是狀態同步 狀態同步簡單來說就是同步遊戲中的各種狀態,當客戶端傳送遊戲動作到伺服器,伺服器接收到之後,通過計算遊戲行為的結果,然後廣...