第八百三十一章 卡頓與延遲
在又稍微的運(yùn)年思索了一下,順便組織了一下接下來的語言。
因?yàn)榻酉聛硪f的東西會稍微顯的有些復(fù)雜,很有可能沒有這方面的技術(shù)的看起來會有些吃力,所以,杰斯特在想著怎么才能夠把他要說的東西說的更加的通俗易懂。
杰斯特接著在新的回帖里面寫道。
“接下來我要說的就要難懂很多了,但是至少仔細(xì)的想一下,其實(shí)也就是那么回事。”
“在說完了上面的那些簡單的概念以及術(shù)語之后,我們來看一個新的概念,這個概念的專有名詞叫做‘內(nèi)插幀’。那么什么叫做‘內(nèi)插幀’?”
“實(shí)際上,內(nèi)插幀是一項(xiàng)技術(shù)用來平滑游戲中的物體行動的,比如說玩家。本質(zhì)上講,內(nèi)插幀是用來平滑一個物體在2個點(diǎn)之間的行動。內(nèi)插幀的延遲通常等于2個快照,但也是會變化的――這么說可能會有些難以理解,但是我們可以舉一個例子來進(jìn)行說明。”
“如果一個玩家直線奔跑,在Tick1的時候他在處,在Tick2的時候在1m處,那么經(jīng)過內(nèi)插幀的處理將之顯示在客戶端,他從的起點(diǎn)非常平滑的移動到1m的終點(diǎn)。但是服務(wù)端,總是并且只是“觀察”到玩家在2個位置,而不是在2點(diǎn)之間。”
“這么說有些理解了吧?”
“也就是說,服務(wù)器進(jìn)行處理的智商兩次tick的快照,沒有內(nèi)插幀的話,游戲就會變的斷斷續(xù)續(xù),因?yàn)榭蛻舳酥皇窃谑盏絹碜苑?wù)端的更新后才能得知游戲中的物體的行為。內(nèi)插幀行為只在客戶端單邊發(fā)生。”
“內(nèi)插幀本質(zhì)上降低了整個游戲在你電腦上的渲染速度,這個數(shù)值通常等于2快照,一般來說所有的游戲都是如此,但是有些游戲允許你更改這些,比如《反恐精英》,這些就是人們在說起rates的時候所指的。他們指的是更新率和內(nèi)插幀延遲。”
這一次杰斯特斌沒有在一個帖子里面寫上所有他想要說的話,因?yàn)楝F(xiàn)在的這些并不好理解,所以,他現(xiàn)在是一個概念一個帖子的進(jìn)行闡述卡跟不卡之間的關(guān)系。
讓更多的玩家不要在似懂非懂的爭執(zhí)這些雞毛蒜皮的事情。
在說完了內(nèi)插幀。并且將闡述這個概念的帖子發(fā)出去之后,杰斯特又開始了一個新的帖子,仍舊是繼續(xù)上面的話題。
“之前說了內(nèi)插幀,那么很多人會好奇,既然有內(nèi)插幀。那么到底有沒有外插幀呢?”
“答案是肯定是,這個世界上面天生就是對稱的,有內(nèi)就會有外,而所謂的外插幀,這是另一個客戶端方面的技術(shù)用來補(bǔ)償延遲。本質(zhì)上說,客戶端外插物體的位置替代降低整個客戶端的渲染。這種做法大體上不及內(nèi)插幀,特別是對于玩家行動不可判斷的FPS游戲來說。”
“所以,在討論《反恐精英》這款標(biāo)準(zhǔn)的FPS游戲的時候我不會太過于詳細(xì)的去介紹這個概念,因?yàn)樗⒉皇俏乙f的話題的主角。”
杰斯特寫的這些術(shù)語介紹什么叫做卡為什么會卡的帖子馬上就引起了玩家們的關(guān)注,雖然有一些看的比較吃力。但是,他們也逐漸的明白了所謂的卡于不卡其實(shí)是一個很復(fù)雜的過程,所以,杰斯特的這個帖子的下面很快的就有了一兩百個贊。
當(dāng)然,杰斯特要說的還沒有說完。
“然后,就是一個重中之重的概念,我們內(nèi)部將其稱之為Hit-box,可以簡單的解釋為命中框或者是命中面積,這樣說似乎就顧名思義了,一個人物的3D模型包含了一些區(qū)域來判斷命中。長寬高的數(shù)據(jù)在3D世界里面精確的描述一個物體。你看不到命中框,你只能看到玩家模型。命中框可大可小,也可某種程度上無法命中,這都要根據(jù)游戲如何編寫來判定。在命中和未命中方面。命中框能夠帶來比快照速率更大的不同。”
“另外的一個非常重要的東西,叫做卡頓補(bǔ)償,這可能在不同的游戲里面會有完全不同的表現(xiàn)。”
“卡頓補(bǔ)償是在服務(wù)端的一種功能,意在減少客戶端延遲的直觀感受。如果沒有卡頓補(bǔ)償,或者卡頓補(bǔ)償不夠理想,你就會朝著一個目標(biāo)瞄準(zhǔn)想要打中。但是由于客戶端電腦“看到”的延遲后的游戲世界,你并不會命中原先瞄準(zhǔn)的區(qū)域。本質(zhì)上講,卡頓補(bǔ)償是在解讀從客戶端接收到的動作,比如開火,盡管動作已經(jīng)發(fā)生過了。服務(wù)端游戲世界和客戶端游戲世界的不同,或者說我們通常所說的客戶端延遲,都可以總結(jié)為:客戶端延遲=(1/2*延遲)+內(nèi)插幀延遲。”
“這其實(shí)是一個很復(fù)雜的機(jī)制,我原本想要三言兩語的將其說明白,但是我發(fā)現(xiàn)這根本沒有辦法做到,索性我就詳細(xì)的說一下什么叫做卡頓補(bǔ)償或者更加確切的一個說法,就是卡頓補(bǔ)償這個機(jī)制到底是怎么運(yùn)行的?”
“現(xiàn)在我描述一個這樣的玩家在游戲里面的游戲場景,來通過這個場景簡單的說一下什么叫做卡頓補(bǔ)償。”
“這個場景是這樣的。”
“玩家A看到玩家B向一個拐角行進(jìn),玩家A開了1槍,客戶端把開槍這個動作發(fā)送給服務(wù)端。服務(wù)端接收到Xms后的數(shù)據(jù),X為玩家A,latency(延遲)的一半。服務(wù)端這時查看過去發(fā)生過的(在記憶加載中),查找到當(dāng)玩家A開槍的時候玩家B的位置。在基礎(chǔ)的例子中,服務(wù)端會返回(Xms+玩家A的內(nèi)插幀延遲)到玩家A看到玩家B的時間點(diǎn),但是其他的數(shù)值因素或許由游戲程序員想要卡頓補(bǔ)償如何施行來決定。”
“服務(wù)端決定玩家A開的槍是否命中。開槍想要被算做命中,需要它必須打在玩家模型的命中框中。在這個例子里,服務(wù)端認(rèn)為玩家A命中玩家B。盡管如此,玩家B的屏幕可能已經(jīng)看到自己在墻后了,但是在玩家B看到自己在墻后的時間和服務(wù)端認(rèn)為玩家B被命中的時間的差異等于:1/2玩家A的延遲+1/2玩家B的延遲+距離上一次快照的時間。”
“在下一次快照中,服務(wù)端更新玩家A、B的客戶端上的數(shù)據(jù)。玩家A看到命中瞄準(zhǔn)的位置X,玩家B看到自己的生命值減少或者死亡。”
“看完這一個過程之后,是不是就對于什么叫做卡頓或者說是延遲有了一個完全不同的清晰的定義了呢?”
杰斯特寫完這些之后,想要將帖子發(fā)出去。但是他突然的想起了一個玩家經(jīng)常爭執(zhí)的問題,正好可以利用這個機(jī)會解釋一下,于是他便在這個帖子的下面緊接著寫道:“我突然的想起了一個FPS游戲玩家之間經(jīng)常的進(jìn)行爭吵的經(jīng)典問題,那就是我跟另外一個玩家同時開火。并且同樣命中,為什么我死了對方卻沒事呢?”
“因?yàn)檫@是不同的游戲存在著不同的設(shè)定的原因,在一些游戲中,比如《反恐精英》,如果先開的一槍到達(dá)服務(wù)端的時候殺死了目標(biāo)。那么任何接下來的所有到達(dá)服務(wù)端的命中目標(biāo)的開火將被服務(wù)端忽略。這種情況下,就不可能存在同時擊殺,因?yàn)?玩家在1快照中向?qū)Ψ介_槍并都死亡。”
“但是,在另外的一些游戲當(dāng)中,比如說有一些人已經(jīng)試玩過的《軍團(tuán)要塞》,共同擊殺是可行的。這里有一個叫做權(quán)重的東西在影響著游戲的進(jìn)程。”
“如果你用《反恐精英》的模型,玩家在良好的延遲下會有明顯的優(yōu)勢,并且在一些時候可能會出現(xiàn)‘Oh,我在死前打了他一槍,但是他并沒有死!’的情況。你甚至?xí)谀闼狼奥牭侥惆l(fā)出的槍聲。但仍沒有造成任何傷害。”
“如果你用目前的《軍團(tuán)要塞》模型,反應(yīng)時間的微小差別并不會意味很多,舉例,如果服務(wù)端快照連拍率是64,如果玩家A比玩家B快了15ms開槍,但是他們都是在的快照中完成這個動作,那么他們就會同歸于盡,整個過程其實(shí)就是這么的簡單。”
“如果卡頓補(bǔ)償過量,會顯示結(jié)果為我在他之后開槍但是還是打死了他。”
“如果卡頓補(bǔ)償不足,會顯示結(jié)果為我需要再移動準(zhǔn)星一點(diǎn)才能打中他。”
“只是看這個的話任何人都會覺得這很簡單。但是拆開來看的話,那就會非常的復(fù)雜,而我剛才說的不過只是一點(diǎn)皮毛而已,實(shí)際上。我并不是專業(yè)的網(wǎng)絡(luò)工程師,對于這個,我知道的也僅僅是一點(diǎn)皮毛罷了。”
“可能很多人會問,我對于你說的這些毫無興趣,我想要知道,我如果卡頓了應(yīng)該怎么辦。我可以有什么辦法來解決自己卡頓的問題呢?”
杰斯特寫到這里的時候把這個帖子發(fā)了出去,然后又另開一貼。
他決定在新的帖子里面詳細(xì)的說一下這個問題。
“如果你想要明顯的改善你的延遲,那么首先,你要確定,你所感受到的卡頓并不是因?yàn)橛螒蛱峁┥處淼模赡芤恍┍热绶?wù)器的負(fù)載等等的問題,讓你覺得游戲不流暢,但是這事跟你無關(guān)的,如果你確定了別人都很流暢,但是我就不流暢之后,那么我下面說的東西或許會給你一點(diǎn)幫助,當(dāng)然,也可能不會。”
“首先,也是最重要的,你的網(wǎng)絡(luò)連接。越低的延遲越好。同時,任何連在你家庭網(wǎng)絡(luò)中的過多的分流都會導(dǎo)致延遲。卡頓補(bǔ)償能夠在‘你在對什么開火’這部分提供幫助,但是如果你有很差的延遲,你更可能會體驗(yàn)到‘我已經(jīng)跑到墻后了但還是挨了一槍’或者‘我先開槍,但依舊是我死’。”
“如果你的客戶端的幀數(shù)很低,只要是低于或者不足于你顯示器的刷新頻率,這會增加延遲的感覺,并且相較不同的快照連拍速率而言感覺更明顯和頻繁。”
“修改內(nèi)插幀,如果游戲允許的話。大多數(shù)游戲都有一個默認(rèn)的內(nèi)插幀時間,最少是2倍的快照間隔。這么做的原因是如果一個單一數(shù)據(jù)包丟失,玩家的動作不會定格在客戶端屏幕上。如果你的網(wǎng)絡(luò)鏈接很好,并且0丟包,那么你完全可以把內(nèi)插幀時間設(shè)定在正好等于2個快照的間隔時間,但如果1個數(shù)據(jù)包延遲了,你便會看到一個斷口。以《反恐精英》為例,這比從20快照服務(wù)器換到64快照服務(wù)器進(jìn)行還要有很大不同。如果你把這個值設(shè)置的很低,會造成斷斷續(xù)續(xù)的畫面。”
“這也是很多玩家在談到卡頓問題的時候,經(jīng)常說到的丟包,其實(shí),這就是內(nèi)插幀的問題。”
諸如此類的東西杰斯特又說了很多,最后他總結(jié)了一句話:“總之,有很多的方法都可以解決一些問題,但是他們不可能解決所有的問題,比如說卡頓,我為什么要發(fā)著幾個帖子說明這些問題的原因很簡單,因?yàn)槲野l(fā)現(xiàn)太多的人根本不懂什么叫做網(wǎng)絡(luò)代碼,甚至對于這個問題一無所知,但是卻總是在抱怨自己在墻后面被殺死。”
“有些時候,你在墻后面被人射死,不僅僅是因?yàn)榉?wù)器的原因,更多的,還是因?yàn)槟阕约旱臋C(jī)器或者網(wǎng)絡(luò)寬帶上面出現(xiàn)了一些問題。”
當(dāng)杰斯特寫完這一整個帖子之后,他竟然發(fā)現(xiàn),已經(jīng)有數(shù)百個回復(fù)出現(xiàn)在了他的這一個帖子當(dāng)中。
很多人都在感謝杰斯特代替開發(fā)組,在百忙當(dāng)中,在為玩家們答疑解惑,當(dāng)然,這些都是對于《反恐精英》的開發(fā)組并不像是一些其他的火星娛樂的游戲那樣,經(jīng)常在玩家社區(qū)出沒的抱怨。不過杰斯特對此的解釋是不同的開發(fā)組有不同的風(fēng)格,他并不強(qiáng)求這樣。
他喜歡在玩家社區(qū)跟玩家交流,但是并不要求所有的開發(fā)組都如此。
但是仍舊有不少人在說杰斯特這明顯的是在為自己的服務(wù)器問題甩鍋,當(dāng)然,這些無腦噴當(dāng)然是被很多自告奮勇的玩家們噴的他們媽媽都不認(rèn)識他們了。(未完待續(xù)。)
,