原文鏈接:Fast-Paced Multiplayer (Part IV): Headshot! (AKA Lag Compensation)
從上1篇文章到現(xiàn)在已過了很久很久了(整整兩年!哦耶!),不過讓我開心的是收到了很多email來問我下1篇甚么時候更新,所以,這里就是更新了!這篇文章的主題可以稱作對延遲敏感事件的時間1致性,但是叫做爆頭好像更加炫酷 : )
總結(jié)1下前面3篇關(guān)于C-S模式文章:
1.服務(wù)器從客戶端收到帶有時間戳的輸入信息;
2.服務(wù)器處理輸入并且更新世界狀態(tài);
3.服務(wù)器以1定的頻率發(fā)送世界信息給所有客戶端;
4.客戶端發(fā)送輸入并且摹擬游戲的結(jié)果;
5.客戶端獲得世界的更新并且
1)將本身預(yù)測的狀態(tài)和服務(wù)器發(fā)送來的狀態(tài)進(jìn)行同步;
2)對所有的Entity進(jìn)行插值
從1個玩家的角度,有兩個重要的影響
1.玩家看到自己是當(dāng)前的;
2.玩家看到他人是過去的;
這其實(shí)并沒有甚么大不了的問題,但是對時間和空間非常敏感的事件就會造成很大的問題;比如在射擊游戲中爆掉敵人的頭!
假定你現(xiàn)在正用你的狙擊步槍完善地瞄準(zhǔn)目標(biāo)的頭部,然后你射擊 - 你覺得這1發(fā)你絕對不可能有失誤,但是你并沒有打中。
到底產(chǎn)生了甚么?
緣由就在于我們之前說的權(quán)威服務(wù)器架構(gòu)中,你瞄準(zhǔn)的敵人的頭部實(shí)際上是100ms之前的位置 - 其實(shí)不是你射擊的那個時刻!
就像在1個速度非常非常慢的世界,你瞄準(zhǔn)的是敵人過去的某個位置,當(dāng)你扣動扳機(jī)的時候,它已跑得非常遠(yuǎn)了。
比較榮幸的是有1個相對簡單的解決方案,對幾近所有的玩家都是友好的,下面來解釋1下它的工作流程:
1.當(dāng)你射擊的時候,客戶端將事件發(fā)送給服務(wù)器:里面還包括了時間戳還有你瞄準(zhǔn)時用的武器。
2.這是最關(guān)鍵的1步。由于服務(wù)器有所有包括時間戳的輸入,它能夠重建出任何過去某個世界的場景,特別的,它能夠重建出某個時間點(diǎn)所有玩家的場景。
3.這意味著服務(wù)器知道你武器的準(zhǔn)心里面某個片刻瞄準(zhǔn)的是甚么,它是敵人的過去某個時候頭部的位置,但是服務(wù)器知道在你當(dāng)前的時刻,那個位置也是你瞄準(zhǔn)的位置。
4.服務(wù)器即時處理掉這個時間點(diǎn),然后更新所有客戶端。
所有人都很開心!
你瞄準(zhǔn)了敵人的頭,設(shè)計,然后取得了1發(fā)爆頭,你也很開心。
敵人多是唯逐一個不那末開心的,如果他1直站在那被你打中了,那是他的錯,不是嗎?但是如果他是1直運(yùn)動的...哇!你真的是1個超級狙擊手!
但是如果在1個開放的地方,然后躲在1堵墻的后面,當(dāng)他以為他安全的時候還是再幾分之1秒以后被殺了,這咋辦呢?
好吧,這確切會產(chǎn)生,這是你要做出的妥協(xié)。由于你射擊的是過去的他,它可能在幾萬分之1秒前還沒躲到墻后呢。
這或許有點(diǎn)不公平,但是這是所有人最可接受的解決方案了,這可比沒法爆頭好多了!
這是我的“快速多人游戲系列“文章的最后1篇了。多人游戲這類東西都是比較tricky的,但是如果你對所有事都了如指掌的話,它其實(shí)不是超級難。
雖然這些文章是寫給游戲開發(fā)者看的,但是還有1群人感興趣的讀者:玩家!從游戲玩家的角度,去了解事情是怎樣產(chǎn)生的也是蠻有趣的。
這些技術(shù)都非常利害,我并沒甚么大不了的,這些文章只是我對學(xué)來的知識的1些簡單的理解,包括1些論文和源碼,還有1些實(shí)驗(yàn)。
和這個主題最有關(guān)的1些文章是
What Every Programmer Needs to Know About Game Networking
Latency Compensating Methods in Client/Server In-game Protocol Design and Optimization.