游戏帧同步的流程与实现
大綱
- 幀同步的基本原理
- 幀事件數(shù)據(jù)采集
- 幀同步的事件處理與動畫
- 幀同步的邏輯數(shù)據(jù)同步
- 幀同步之跳幀處理
現(xiàn)代多人游戲中,多個客戶端之間的通訊大多以同步多方狀態(tài)為主要目標(biāo),為了實現(xiàn)這一目標(biāo),主要有兩個技術(shù)方向:
- 狀態(tài)同步
- 幀同步
狀態(tài)同步
狀態(tài)同步簡單來說就是同步游戲中的各種狀態(tài),當(dāng)客戶端發(fā)送游戲動作到服務(wù)器,服務(wù)器接收到之后,通過計算游戲行為的結(jié)果,然后廣播下發(fā)給客戶端游戲中的各種狀態(tài)數(shù)據(jù)??蛻舳私邮盏綘顟B(tài)數(shù)據(jù)后顯示內(nèi)容。這種做法類似于各個客戶端都在遠(yuǎn)程操作服務(wù)器上的軟件。例如最高的mud,以及日后大量的國產(chǎn)網(wǎng)游,特別是回合制游戲,大多采用這種方式。
狀態(tài)同步的流程:
為了給游戲玩家更好的體驗,減少同步的數(shù)據(jù)量,客戶端也會做很多的本地運算,減少服務(wù)器同步的頻率以及數(shù)據(jù)量。
狀態(tài)同步其實是一種不嚴(yán)謹(jǐn)?shù)耐?#xff0c;它的思想中不同玩家屏幕上的一致性的表現(xiàn)并不是重要指標(biāo),只要每次操作的結(jié)果相同即可。所以狀態(tài)同步對網(wǎng)絡(luò)延遲的要求并不高。例如:RPG游戲中200~300ms的延遲對用戶來說是可以接受的,但在RTS(即時戰(zhàn)略)游戲中50ms的延遲卻會很受傷。
幀同步
幀同步是RTS游戲經(jīng)常采用的一種同步技術(shù),狀態(tài)同步中數(shù)據(jù)量會隨著需要同步的單位數(shù)量增長,而對于RTS來講動不動就是幾百個單位可以被操作,如果這些都需要同步的話,數(shù)據(jù)量是不能被接受的,所以幀同步不同步狀態(tài),之同步操作。例如游戲中同步玩家的操作指令,操作指令包含當(dāng)前的幀索引。
簡單來說,客戶端發(fā)送游戲動作到服務(wù)器,服務(wù)器接收并匯總,然后直接轉(zhuǎn)發(fā)給所有客戶端,或者客戶端直接通過P2P技術(shù)發(fā)送??蛻舳烁鶕?jù)收到的游戲動作來做運算和顯示。這種做法等于客戶端之間相互遠(yuǎn)程控制其他客戶端上的游戲軟件。早期的ipx網(wǎng)絡(luò)游戲,例如紅色警戒、帝國時代、星際爭霸,以及大量支持網(wǎng)絡(luò)連線雙打游戲機(jī)模擬機(jī),都是采用這種方式。
那些游戲需要使用幀同步呢?
- 多人實時對戰(zhàn)游戲
- 游戲中需要戰(zhàn)斗回放功能
- 游戲中需要加速功能
- 需要服務(wù)器同步邏輯校驗防止作弊
幀同步的流程
正在上傳…重新上傳取消
幀同步
幀同步主要依賴客戶端的能力,服務(wù)器僅僅是做一個轉(zhuǎn)發(fā),甚至客戶端可以無需服務(wù)器,通過P2P方式來轉(zhuǎn)發(fā)數(shù)據(jù)。由于只是轉(zhuǎn)發(fā)游戲的行為,所以廣播的數(shù)據(jù)量比狀態(tài)同步要小很多。非常適合游戲行為非常頻繁的動作游戲,諸如飛行射擊、FPS、RTS(即時戰(zhàn)略)。
狀態(tài)同步由于要把整個游戲的狀態(tài)都廣播下去,如果游戲中的對象特別多,比如滿屏的子彈、怪物,那么要廣播的數(shù)據(jù)量就會很大,這個時候幀同步的優(yōu)勢就比較明顯,因為不管有多少”機(jī)器控制的角色“,僅僅需要廣播玩家角色有關(guān)的操作即可。反過來,如果游戲中有大量玩家同時聚集,那么幀同步和狀態(tài)同步的差異就不太明顯。反而狀態(tài)同步能得到更多安全性,因為游戲運算在服務(wù)器上,比較容易防止外掛。
簡單來說,幀同步技術(shù)最要的概念是”相同的輸入 + 相同的時機(jī) = 相同的顯示“。也就是說,游戲接收來自網(wǎng)絡(luò)的多個客戶端的操作,如果這些操作在各個客戶端上都是一樣的,那么多個客戶端的顯示也就是一樣的,進(jìn)而帶來了”同步“的效果。在這種情況下,各個客戶端的運算要絕對一致,不能依賴諸如本地時間、本地隨機(jī)等”輸入“,而要一切以網(wǎng)絡(luò)來的數(shù)據(jù)為主。
正在上傳…重新上傳取消
幀同步
因為幀同步的特性,因此很容易做出戰(zhàn)斗回放,即服務(wù)器記錄所有操作,客戶端請求到操作文件再執(zhí)行一次。幀同步的特性導(dǎo)致客戶端的邏輯實現(xiàn)和表現(xiàn)實現(xiàn)必須完全分離。
幀同步的目的在于消除網(wǎng)絡(luò)波動性帶給玩家的卡頓以及忽快忽慢的不良體驗。
轉(zhuǎn)存失敗重新上傳取消
網(wǎng)絡(luò)波動的平滑處理
狀態(tài)同步和幀同步的比較和選擇
對于單位比較多的即時策略游戲,幀同步是很好的選擇。相反的,如果玩家比較多,狀態(tài)同步則更加合適,因為安全性更高。一般大型MMOARPG都采用狀態(tài)同步,由于狀態(tài)同步采用C/S架構(gòu),所有狀態(tài)由服務(wù)器來控制,安全性比較高,但流量比較大。幀同步采用的是囚徒模式,所有C端強(qiáng)制采用一個邏輯幀率,從而保證輸出一致,其特點是流量小,安全性較差。
囚徒模式又叫鎖步模式,就是把所有參與對戰(zhàn)的客戶端看成排成一列的囚犯,這些囚犯們的左腳都被鎖鏈給連起來,如果要往前走,就只能同時邁步,如果其中某個人走快了或走慢了,都回讓整隊人停下來。
正在上傳…重新上傳取消
狀態(tài)同步和幀同步的比較
幀同步的基本原理
幀同步是一種對同步源進(jìn)行像素級同步顯示的處理技術(shù),對于網(wǎng)絡(luò)上的多個接入者,一個信號將會通過主機(jī)同步發(fā)送給其他人,并同步顯示在各個終端上。同步信號可以是每幀的像素數(shù)據(jù),也可以是影響數(shù)據(jù)變化的關(guān)鍵事件信息。
幀同步在網(wǎng)絡(luò)游戲應(yīng)用中的設(shè)計有別于傳統(tǒng)的MMORPG游戲,因為可以承載大量的后臺計算,實現(xiàn)類單機(jī)的效果,所以可以在射擊類、飛行類游戲中實現(xiàn)彈幕計算或格斗類的高精度打擊效果。
什么叫做幀同步呢?服務(wù)器收集客戶端手機(jī)發(fā)送過來的操作,然后在特定的時間(收集完成之后),再廣播發(fā)送給每個客戶端。客戶端根據(jù)接收到的輸入,進(jìn)行同樣的邏輯處理,最終得到同樣的結(jié)果的過程。在實現(xiàn)上,一般都是以服務(wù)器按固定的幀率,來搜集每個客戶端的輸入,然后把這些輸入廣播給所有客戶端。由于每個操作指令到達(dá)所有客戶端的時間(幀)都是一樣的,所以每個客戶端運算的結(jié)果也是一樣的,也就是同樣的輸入就會得到同樣的結(jié)果。
這就好像是玩家通過網(wǎng)絡(luò)將操作手柄連接到你的手機(jī),這種同步方案是傳統(tǒng)單機(jī)局域網(wǎng)游戲中最常見的。
正在上傳…重新上傳取消
幀同步
幀同步模型最大的優(yōu)點在于強(qiáng)一致性,每個客戶端的表現(xiàn)是完全一樣的,非常適合高度要求操作技巧的游戲。由于廣播的僅僅是玩家的操作,所以數(shù)據(jù)量很少。不管游戲中的角色數(shù)量、狀態(tài)數(shù)量有多大多復(fù)雜,都不會影響廣播的數(shù)據(jù)量。
幀同步模型最大的缺點是對所有玩家的延遲都有要求,一般來說要求在50毫秒以內(nèi),如果有一個客戶端網(wǎng)絡(luò)卡住了,所有客戶端都要停下來等待。
另外在幀同步模式中,數(shù)據(jù)同步的頻率較高,網(wǎng)絡(luò)延遲越小越好。由于TCP的滑動窗口機(jī)制和重傳機(jī)制,導(dǎo)致延時機(jī)制,導(dǎo)致延時無法控制。因此幀同步一般采用UDP進(jìn)行網(wǎng)絡(luò)傳輸,但UDP又會衍生出可靠性問題,對于客戶端,如果某些UDP包沒有收到,就會出現(xiàn)丟幀的情況。
正在上傳…重新上傳取消
幀同步技術(shù)原理
客戶端A的操作A1與客戶端B的操作B1,共同封裝成OperateCmd數(shù)據(jù)發(fā)送給PVP服務(wù)器,PVP服務(wù)器每66毫秒產(chǎn)生一個邏輯禎,在該楨所在時間段內(nèi),收到A1和B1后,生成一個Frame數(shù)據(jù)塊,在該幀時間結(jié)束時,將Frame發(fā)送給客戶端A和B。Frame數(shù)據(jù)塊內(nèi)有該幀的幀號,客戶端A和B接收到Frame數(shù)據(jù)后,便知道該幀內(nèi),客戶端A和客戶端B都做了什么操作。然后根據(jù)接收到的消息A1和B1進(jìn)行游戲表現(xiàn),最終呈現(xiàn)給玩家A和B的結(jié)果是一致性的,從而實現(xiàn)客戶端A和B的數(shù)據(jù)同步。
正在上傳…重新上傳取消
幀同步
幀同步既然是在特定時間發(fā)送,也就是說每隔一段時間收集用戶操作指令,那么要間隔多久內(nèi)。例如每隔一段時間搜索用戶的操作。此時,如果時間太快則網(wǎng)絡(luò)速率達(dá)不到要求,如果時間太長則用戶操作不流程。哪里多少才比較合適呢?根據(jù)統(tǒng)計玩家至少要在50ms100ms可以完成一次,一般維持到1520次左右會比較安全。
?
總結(jié)
以上是生活随笔為你收集整理的游戏帧同步的流程与实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件测试面试如何介绍自己的项目,【松勤软
- 下一篇: 软件测试常见面试题及解答