csgo進行額外比賽必須等待;csgo交易需要等待7天
FPS游戲中,在玩家的延時都不一樣的情況下是如何做到游戲的同步性的?
下面會大量使用CSGO作為例子,這是因為Valve在多人游戲的網絡通信方面做得較好,可以當做一個典型來分析。
先講多人競技游戲中客戶端和服務器是如何互動的吧。
游戲中所有的邏輯判定都是由服務器完成的,客戶端只負責發送請求和接收服務器的反饋,并把反饋具象化。拿CSGO做例子吧,比如你(玩家A)拿著AK瞄準了玩家B的頭開了一槍,那么你的客戶端會向服務器發送一個數據包,里面包含了誰(你)拿著什么武器(AK)從什么位置(你在地圖上的坐標)向什么方向(角度)開了一槍。服務器收到后進行判定,這一槍的傷害會經過玩家B的頭部模型,判定為爆頭傷害,數值為104(這個值是瞎編的),因此判定玩家B死亡。然后向所有玩家的客戶端通信,更新當前游戲狀態,其中會包括玩家A用AK爆頭擊殺了玩家B,也會包括其他游戲信息,比如玩家的位置等等。你(玩家A)收到通信后再你的GUI上顯示你擊殺了玩家B,而玩家B則會收到被你擊殺的信息。
接著講一個概念,叫服務器的通信頻率(tick rate)。事實上服務器不是實時地向玩家通信來更新游戲狀態的,因為這樣需要的計算量很大,同時對網絡帶寬的要求也會高的不現實。因此服務器會以一定的頻率來進行通信。 CSGO在娛樂模式下通常采用60Hz的頻率,也就是說每過1/60秒玩家的客戶端就會收到一次新的信息。如果回到上面那個例子,那么實際情況應該是:你(玩家A)拿著AK瞄準了玩家B的頭開了一槍,你的客戶端會向服務器發送一個數據包,服務器接收后進行判定。判定完成后等待至下一次通信,再向所有玩家更新游戲狀態。也就是說游戲過程其實是一個離散的過程而非連續過程。
上面的例子都假設客戶端和服務器之間的延遲無窮小。那么當玩家Ping很大的時候會發生什么的呢?假設你(玩家A)與服務器之間存在100ms的延遲(單向,往返則是200ms),其他玩家的延遲忽略不計,服務器的通信頻率足夠大(頻率不夠大還會造成其他很嚴重的問題,這個放在后面講)。你在某一刻向服務器發送了一個請求(比如向前走),那么這個請求會在100ms之后到達服務器。服務器判定后返回結果,再經過100ms你的客戶端會收到確認,服務器已經把你的位置向前移動了若干距離。假設客戶端在沒有收到任何服務器的更新前畫面都不會變化,那么著200ms內你就會覺得游戲“卡頓”。
實際上在很多游戲里(比如CSGO)在這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應該存活。換句話說采用倒帶法的服務器里如果有一個延遲很大的玩家將會拖累其他低延遲玩家的游戲體驗。
Bonus:
前面的例子都是以服務器的通信頻率足夠高為前提的,下面簡要描述一下低通信頻率帶來的問題。這里我要舉的例子是大名鼎鼎的《戰(和諧)地4》(下稱BF4)。
BF4在剛剛發布的時候可謂是Bug滿天飛整一個就是半成品,其中非常嚴重的就是網絡通信問題(netcode issue)。根據制作組DICE提供的信息,BF4的通信頻率是10Hz。這是一個相當低的設定了,大多數FPS的通信頻率在30Hz左右,而CSGO為60Hz,電子競技比賽時一般服務器的通信頻率還會提高到120Hz(因為比賽時大家都是在一個局域網里所以延遲很小高頻通信能夠更加精確反映游戲內狀態)。由此帶來什么糟糕的后果呢?
1.游戲體驗的不連貫。BF4的客戶端,和其它很多游戲一樣有應用客戶端預測法來補償延遲。但是因為服務器更新的頻率是在太慢了(0.1秒才更新一次,人類的反應時間差不多略小于0.1秒,即玩家已經可以感覺到其中的不連貫)。拿移動來舉例吧,玩家正常的前進,突然玩家的延遲很短暫的增加了一下然后又回到正常(也就是spike),那么其中某一次移動的請求就會花更多的時間到達服務器。客戶端這邊因為沒有收到服務器的通信而繪制了玩家前進的樣子,0.1秒后服務器告知客戶端實際的位移小于繪制的距離,客戶端進行糾正(瞬間向后退)而0.1秒可以前進很大一段距離了(至少肉眼可以感覺出來有變化了),如此瞬移回退讓玩家感覺非常不舒服,即使延遲很小只要有變化就有可能發生這種情況。同樣的情況適用于玩家看到的其他玩家所在的位置。在服務器中敵人的位置往往比客戶端上顯示的要滯后,因此很多時候明明瞄準了卻打不中。相對的,如果提高通信頻率,客戶端“擅自”繪制的畫面和服務器數據能夠以更高的頻率進行糾正,其中每次產生的變化都不會讓玩家察覺。
2.“瞬間”擊殺(Instant Kill)。BF4里的自動武器射速絕大多數都超過了600RPM(即每0.1秒一發),高射速武器如AEK971可以達到900RPM甚至更高。而大多數武器在近距離內都是造成25傷害(玩家滿血100)。因此玩家(A)完全可以在0.1秒內發射至少2發,在近距離內擊殺生命值小于等于50的玩家(B)(這個邊界值隨射速提高而提高,如AKE971可以在0.1秒于近距離擊殺生命小于等于75的玩家)。假設玩家A開始射擊的一瞬間服務器剛好進行了一次對客戶端的通信,玩家A在之后的兩次發送射擊請求都被服務器接收并判定(玩家B死亡),而一直到玩家A開火后的0.1秒內玩家B都沒有接收到任何被攻擊的信息。0.1秒后玩家B死亡,而玩家B的客戶端只能繪制一次玩家A開火(雖然收到兩次開火的信息),且因為玩家B已經死亡客戶端只顯示kill cam。 簡單來說玩家B完全沒有還手或者躲藏的機會,因為玩家B一直都認為自己沒有受到攻擊,只是在一瞬間就被A打死了。對玩家A來說整個過程沒有任何問題,而玩家B則是個冤大頭。此時的BF4已經失去了競技的平衡性。
在BF4發布八個月后(沒錯,八個月,期間發布了數款BF4的DLC),發行商EA(果然不要臉)終于決定要修復這些問題。一開始他們決定吧BF4的服務器端通信頻率提高到30Hz。然而BF4是一款復雜度遠遠超過其他FPS游戲的一款作品(64人,海陸空載具,彈道分析【BF里的并非是在發射的瞬間就擊中了敵人而是要經過一定的飛行時間才會擊中,且還會受到重力影響而下墜】),30Hz的通信頻率就已經讓很多玩家的電腦吃不消了。后來采取了一個折中策略,玩家附近的游戲狀態以30Hz的頻率進行更新,而距離玩家較遠的信息繼續以10Hz的頻率來更新。 同時還提供一個選項允許客戶端以更高的頻率向服務器“索要”數據(當然其中造成的硬件負擔不可小覷)。目前BF4的網絡通信已經恢復到“可玩”的狀態。根據某些資深玩家推測,BF4的服務器無法以超過30Hz的頻率進行通信,主要原因是其引擎寒霜3內核有缺陷。因此BF4不太可能成為一款競技游戲走向電競舞臺。
感覺既然扯了BF4的低頻通信那就再在戰地系列里擴展一下吧。
最早出現低頻(10Hz)通信的戰地系列游戲是戰地:叛逆連隊2(BF:BC2),然后戰地3(BF3)也沿用了一樣通信頻率。細心的玩家會發現自BFBC2以來所有的戰地系列游戲使用的都是寒霜(Frostbite)引擎 (BFBC2是寒霜,BF3是寒霜2,BF4和戰地:硬仗BFH是寒霜3)。使用低頻和引擎的關系很大(如之前所述)。
我在這里想講的是同樣是使用低頻通信,同樣存在嚴重的網絡通信問題,BFBC2被譽為神作被很多戰地系列的老玩家奉為經典,而BF4被黑的死去活來(youtube上和Reddit論壇上甚至有針對DICE的檄文)的原因。
BFBC2是2009年發布的FPS游戲,是第一款使用寒霜引擎的多人FPS(當時也是DICE拿來賣引擎的作品,和孤島危機類似)。在發布后立刻好評如潮,時至今日在北美依然有不少服務器在線供玩家游戲(包括其DLC越南)。當時很多玩家都沒有注意到低頻通信帶來的問題,即使瞬殺等問題存在。這里最主要的一個原因在于BFBC2中武器的設定。
BFBC2中所有的武器(除去栓動和攜帶獨頭彈的泵動式)傷害都比較小,常規的突擊和通常需要5-7發(擊中軀干)才能擊殺一個滿血的敵人,遠距離需要更多,而輕往往需要7法以上,但遠距離傷害不減少。這主要帶來的一個特征就是TTK(擊殺時間)相對當時很多主流FPS游戲都要長(相比使命召喚,CS:S等,網游不考慮在內)。因此在10Hz的通信環境下,要出現和BF4中類似的瞬殺的情況條件苛刻很多(玩家的生命值必須非常低,而不是50%或者75%以下)。同時BFBC2中的武器射速普遍沒有那么高(高射速應該是從BF3開始的),因而即使玩家生命值很低需要擊殺的時間也可能會超過0.1秒,那么玩家就能夠有足夠的反應時間。另外BFBC2最多只允許32人同服游戲,近距離的接戰沒有那么混亂,玩家感覺到“莫名其妙就死了”的概率也低很多。
在BFBC2發布后的一段時間開始有玩家注意到了網絡通信中的瑕疵,并嘗試在youtube上制作視頻進行說明,但并沒有得到很多響應。說到底當時BFBC2絕對是跨時代的作品,其優秀的游戲品質和創新的設定讓玩家對網絡通信中的瑕疵更加寬容。試想一下,BFBC2是世界上第一款引入全場景可破壞的FPS游戲,是第一款強調步兵小隊作戰的戰地游戲,是第一款主推快攻(rush)模式的FPS游戲(這個模式貌似還是只在戰地系列中有,RO2和Insurgency有類似的模式但不同),玩家自然對其百般推崇。網絡通信中的小瑕疵?沒關系,玩的爽就行。
到了BF4發布的時候,很多玩家怒了。
第一,BF4很大程度上只是BF3換了層皮,而且開發很不完善,bug很多(前面有提到),玩家對DICE極度不滿,自然就有人出來挑刺。
第二,BF4武器射速以及傷害模型的問題,使得網絡通信質量問題更加凸顯,youtube上大量的視頻都表明要復原通信問題比BFBC2簡單很多。
說起來EA和DICE也是臉皮很厚的,發布后八個月(之前提到過)才開始嘗試修復。他們的理由是:“開發人員去度假了”。