FPS遊戲原理漫談 玩家延時與伺服器同步

2021-10-09 20:01:58 字數 2501 閱讀 1990

文/周愷華

在在fps遊戲中玩家延時都不一樣的情況下是怎樣做到遊戲的同步?知友「周愷華」對此給出較為充實的回答,有興趣了解這方面知識的玩家可以通過下面的回答來一窺究竟:

宣告:下面會大量使用csgo作為例子,因為valve在多人遊戲的網路通訊方面做得較好,可以當做乙個典型來分析。

多人競技遊戲中客戶端和伺服器的互動

遊戲中所有的邏輯判定都是由伺服器完成的,客戶端只負責傳送請求和接收伺服器的反饋,並把反饋具象化。拿csgo做例子,玩家a拿著ak瞄準了玩家b的頭開了一槍,那麼玩家a的客戶端會向伺服器傳送乙個資料報,裡面包含了誰(玩家a)拿著什麼**(ak)從什麼位置(玩家a在地圖上的座標)向什麼方向(角度)開了一槍。伺服器收到後進行判定,這一槍的傷害會經過玩家b的頭部模型,判定為爆頭傷害,數值為xx,判定玩家b死亡。伺服器再向所有玩家的客戶端通訊,更新當前遊戲狀態,其中包括玩家a用ak爆頭擊殺了玩家b,也會包括其他資訊,比如玩家們的位置等等。玩家a收到通訊後顯示擊殺了玩家b,玩家b則會收到被擊殺的資訊。

接著講乙個概念,叫伺服器的通訊頻率(tick rate)。事實上伺服器不是百分百實時地向玩家通訊來更新遊戲狀態的,那樣需要的計算量很大,同時對網路頻寬的要求也會高的不現實,因此伺服器會以一定的頻率來進行通訊。

csgo在娛樂模式下通常採用60hz的頻率,也就是說每過1/60秒玩家的客戶端就會收到一次新的資訊。如果回到上面那個例子,那麼實際情況應該是:玩家a拿著ak瞄準玩家b的頭開一槍,你的客戶端會向伺服器傳送乙個資料報,伺服器接收後進行判定。判定完成後等待至下一次通訊,再向所有玩家更新遊戲狀態。也就是說遊戲過程其實是乙個離散的過程而非連續過程。

csgo是近年來不錯的fps遊戲

如果玩家的ping很大,伺服器會怎麼辦?

上面的例子都假設客戶端和伺服器之間的延遲無窮小,那麼當玩家ping很大的時候會發生什麼的呢?

假設玩家a與伺服器之間存在100ms的延遲(單向,往返則是200ms),其他玩家的延遲忽略不計,伺服器的通訊頻率足夠大(頻率不夠大還會造成其他很嚴重的問題,這個放在後面講)。玩家a在某一刻向伺服器傳送了乙個請求(比如向前走),那麼這個請求會在100ms之後到達伺服器,伺服器判定後返回結果,再經過100ms你的客戶端會收到確認,伺服器已經把你的位置向前移動了若干距離。假設客戶端在沒有收到任何伺服器的更新前畫面都不會變化,那麼在這200ms內你就會覺得遊戲「卡頓」。

實際上很多遊戲裡中你會在這200ms裡看到你自己是在向前走,其實那只是客戶端「擅自」在繪製你前進的樣子,這是一種延遲補償策略,稱為「客戶端**法」。即客戶端能夠大致**遊戲未來的走向,因此在接收到伺服器更新前會把**到的畫面先繪製出來(比如移動、**的**效果、彈藥計數的變化等)。客戶端收到伺服器通訊後如果資料有出入則立刻糾正為伺服器提供的資料。因此在延遲很大的時候玩家會發現「明明往前走了過了一會又瞬移回到之前的位置」的原因,或者是「明明開了好幾槍而且也都顯示了但過了一會彈藥計數只減少了一點點」。

既然扯到這裡了那就認真的講下延遲補償策略(lag compensation),一般來講補償策略分伺服器端和客戶端兩類,上面提到的**法屬於客戶端一類,其他的客戶端策略還有插幀法。所謂插幀法就是客戶端會記錄之前一次從伺服器收到的資訊,然後在接受到下一次通訊的時候不立刻更新遊戲畫面,而是逐漸的更新畫面(比如兩次通訊間玩家b移動了10單位距離,客戶端會繪製玩家b以一定的速度移動了這10單位距離,而非立刻繪製玩家b瞬間移動了10單位距離)。插幀法的問題在於如果玩家並未沿直線運動且其直線路徑中有本應不能通過的物體存在時(比如繞過一堵牆),客戶端會繪製出該玩家穿牆而非繞過去的動作。

伺服器端處理延時同步常用的策略

1.「眼不見為淨」法,伺服器不去補償玩家的延遲是乙個合理的做法,特別是當遊戲內進行的事件非常多(想想《行星邊際2》裡面千人同圖混戰的情形)。浪費寶貴的伺服器資源去補償個別玩家的延遲是不明智的。這個策略的缺點很明顯,就是玩家有可能會對遊戲體驗不滿意。

2.「倒帶」法,採用倒帶法的伺服器會記錄剛剛過去一段時間內(比如0.5秒)遊戲內的所有資訊。當乙個有延遲的玩家(比如200ms)向伺服器傳送乙個請求,那麼伺服器在處理這個請求的時候會調取0.2秒前遊戲的狀態然後進行判定,在把判定結果對所有客戶端進行同步,如此一來該玩家的操作雖然有延遲但也能與他/她所看見的畫面一致。該策略的最大問題在於它讓不同延遲之間的玩家被迫體驗較大的延遲。舉個例子,假設遊戲裡擊殺時間(ttk)足夠小,玩家a(10ms延遲)和玩家b(延遲200ms)對射,兩人都是空血(一次攻擊即死),a比b先**(時間差很小,比如50ms)。玩家a的次攻擊很快(10ms後)就得到了處理並記錄在伺服器中,玩家b被判死亡。然而在200ms後玩家b的請求到達,伺服器倒帶0.2秒,此時玩家ab都未死亡,因此玩家b的攻擊有效,玩家a也被判定為死亡。如果沒有延遲,那麼伺服器應該會判定玩家b死亡,因此玩家b將無法攻擊,玩家a應該存活。換句話說採用倒帶法的伺服器裡如果有乙個延遲很大的玩家將會拖累其他低延遲玩家的遊戲體驗。

阿里雲伺服器配置 SVN 伺服器與生產站點同步

作為linux的門外漢,一直覬覦svn的方便性,在有臺aliyun的情況下,一起來搞搞。1.環境 阿里雲 centos5.5 2.安裝svn yum y install subversion 3.配置 建立版本庫目錄 mkdir alidata www svndata svnserve d r al...

DHCP伺服器原理與配置詳解

dhcp 伺服器 一 dhcp服務是什麼 dhcp 稱為動態主機配置協議。dhcp服務允許工作站連線到網路並且自動獲取乙個ip位址。配置dhcp服務的伺服器可以為每乙個網路客戶提供乙個ip位址 子網掩碼 預設閘道器 乙個wins伺服器的ip位址,以及乙個dns伺服器的ip位址。dhcp 伺服器減少了...

web伺服器apache架構與原理

web伺服器 在開始了解apache前,我們先熟悉一下web伺服器,因為apache也是web伺服器的一種。web系統由客戶端 瀏覽器 和伺服器端兩部分組成。web系統架構也被稱為b s架構。最常見的web伺服器有apache iis等,常用的瀏覽器有ie firefox chrome等。當你想訪問...