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