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