快節奏的多人遊戲同步 - Part 4

爆頭!(亦稱:延遲補償)

簡介:

自從我發表上一篇文章以來已經過去了很長很長一段時間(足足2年!我勒個去!),而讓我驚喜的是,我收到了相當多詢問“下一篇”的郵件。那麼這就是“下一篇”了,也可以稱爲“潛在敏感性事件的時間統一”,但“爆頭”這個詞聽起來更令人滿意:)

簡述:

前面三篇文章解釋了一種客戶端-服務器結構,可以被概況爲以下幾點:

·→服務器從所有客戶端獲得帶有時間戳的輸入指令信息

·→服務器處理這些信息並向世界更新

·→服務器週期性的向所有客戶端發送遊戲世界快照

·→客戶端發送輸入指令並自行在本地模擬出效果

·→客戶端獲取世界更新並:

           將預演信息同步給權威服務器

           插值獲知其他實例的過去狀態

從玩家的角度講,這裏會有兩個重要後果:

·→玩家看到現時的自己

·→玩家看到過去的其他實例

這種情況通常沒有問題,但是如果總是這樣或者遇到空間敏感事件時就是問題了;例如射擊擊中你敵人的頭時!

延遲補償

當你用大狙精確的瞄準敵人的腦袋瓜時,你扣動扳機——這一擊你不能打偏。

但是你打偏了。

咋回事?

是因爲上述的客戶端——服務器架構,你所瞄準射擊的是你敵人100ms之前腦袋所在的位置,而不是你開槍時的位置!

換一種說法,這就像在一個光速非常非常低的宇宙中,你瞄準的是你敵人過去所在的位置,但是在你扣動扳機是人家早走了。

幸運的是,有個相對簡單的解決辦法,也是大多數情況下大多數玩家樂於接受的(會有一個例外,下文再說)

這裏是其運作原理:

·→當你射擊時,服務器將此事件的全部信息發送至服務器;精確的射擊時間戳和精確的武器瞄準點。

·→這是關鍵性的一步。因爲服務器獲得所有輸入信息都帶有時間戳,它可以權威緊急重建過去的世界,特定情況下,可以立即重建一個指定時間點上和任意客戶端看到的完全一致的精確世界。

·→這意味着服務器可以精確或者誰在你射擊的那一刻在你武器的傷害範圍之內。那就是你敵人過去時的腦袋瓜兒,但服務器也知道,在你屏幕上這就是他腦袋瓜兒現時的位置。

·→服務器處理完這個時間點的這一擊之後,更新給客戶端。

皆大歡喜!

服務器也歡喜,因爲他是服務器,他總是歡喜的。(0.0)

你也歡喜,因爲你瞄準敵人的頭,射擊,並且得到了爆頭獎勵!

敵人可能是唯一一個不怎麼歡喜的人,如果他站着不動當活靶子,那是他自己的鍋,對吧?可是如果他明明動了...喔,你真是個牛逼狙手。

但是假如他是在一個開闊地帶,背後是牆,零點幾秒後捱了一槍,他還仍然會覺得自己很安全嗎?

這種事一定會發生。需要你做一下權衡。因爲你打的是過去的他,所以在他跑到掩體後的若干毫秒內,他仍然可能被擊中。

這就有點不公平了,但這也是能夠最大限度讓所有參與者接受的。明明能打中的打不中可比這糟多了!

結論:

以此來終結我關於快節奏多人遊戲的系列文章。這種事是典型的很難完全處理正確的,但可以使進行中的事物有明確的概念認知,學習成本很低。

儘管這些文章的讀者都是遊戲開發者,我也發現了另一羣感興趣的讀者:玩家!從玩家角度來說去弄清楚爲什麼某些事會發生以及其發生的原理也是很有趣的事情。

擴展閱讀:

鑑於上述技術如此之精妙,我不敢聲明任何對它們的權益;這些文章只是簡單易懂的引導了一些概念。我也是從其他資源哪裏學習得來的,包括文章和源代碼以及一些實驗。

與此主題相關性最高的文章有:

What EveryProgrammer Needs to Know About Game Networking and LatencyCompensating Methods in Client/Server In-game Protocol Design and Optimization.(《每個程序員都應該知道的:關於遊戲網絡》和《暗中補償法客戶端/服務器遊戲內協議涉及和優化的應用》)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章