延遲補償:高 ping 還能命中的原理
多數連線遊戲採用「伺服器權威」(Server Authoritative)架構。意思是:遊戲世界的最終真相只存在於伺服器上,客戶端只是負責顯示與接收輸入。你按下 W 鍵往前走,客戶端會先「預測」你往前走,讓畫面立即有反應;同時把這個輸入指令送到伺服器。伺服器根據自己的規則計算後,再把正確結果廣播給所有玩家。
為什麼要這樣設計?因為如果讓每個客戶端自己決定「我有沒有打中」,那作弊者只要修改本地檔案就能百發百中,而且不同玩家之間的畫面會完全對不上。伺服器權威確保了公平性與一致性,代價就是延遲——所有操作都必須經過伺服器這一關。
這就帶出了一個根本矛盾:玩家想要「零延遲」的即時反應,但真相又只能由伺服器裁定。客戶端預測(Client-side Prediction)解決了前半段:你先看到自己動,不用等伺服器回覆。但「我有沒有打中敵人」這件事,最終還是得由伺服器說了算,因為只有它同時掌握所有玩家的位置。
於是問題來了:當你開槍的那一刻,伺服器上敵人的位置,跟你螢幕上看到的敵人位置,其實不是同一個位置。你看到的敵人是幾十甚至上百毫秒前的狀態。如果不做任何處理,你會發現「明明瞄準了卻打不中」,因為伺服器用「現在」的敵人位置去判定,而你瞄準的是「過去」的敵人。延遲補償,就是用來解決這個問題的。
二、延遲補償的核心:讓伺服器「回到過去」
延遲補償的基本思路可以用一句話概括:當玩家開火時,伺服器不要用「現在」的敵人位置來判定,而是回到「玩家當時看到的那個時間點」的敵人位置來判定。換句話說,伺服器要學會時光倒流。
2.1 快照與歷史緩衝區:伺服器的時光機
要做到時光倒流,伺服器必須先把過去一段時間的世界狀態保存下來。這個「世界狀態」通常包含每個玩家的位置、朝向、速度、是否蹲下、是否在移動等關鍵資訊,業界常稱為快照(Snapshot)或狀態快照。
伺服器以固定的 tick rate 運作,例如 64 tick 代表每秒更新 64 次,每個 tick 間隔約 15.6 毫秒;128 tick 則是每 7.8 毫秒一次。每一個 tick,伺服器都會把當前所有玩家的狀態塞進一個環形緩衝區(Ring Buffer),並附上一個時間戳。這個緩衝區通常只保留最近 1 秒左右的資料,因為延遲補償不需要無限回溯,超過某個上限就沒有意義了。
為什麼是 1 秒?因為世界上絕大多數玩家的 ping 不會超過 500 毫秒,加上插值延遲後,需要回溯的時間通常在幾百毫秒以內。以 Source 引擎為例,伺服器變數 sv_maxunlag 預設就是 1.0 秒,意思是伺服器最多願意往回找 1 秒前的狀態來做命中判定。超過這個上限的玩家,就會被視為「延遲過高」,伺服器不會再為他無限回滾。
這個歷史緩衝區就是延遲補償的資料基礎。沒有它,伺服器根本無從得知「玩家開火那一刻,敵人站在哪裡」。
2.2 回滾命中判定:伺服器怎麼決定你打中了
現在來看實際流程。假設你(射手)ping 是 120 毫秒,客戶端插值設定讓你的畫面再落後 100 毫秒,那麼你螢幕上看到的敵人位置,大約是 220 毫秒前的狀態。當你按下開火鍵,客戶端會送出一個射擊指令,裡面通常包含:
你開火當下的視角方向(水平與垂直角度)
你開火當下的角色位置
一個時間戳,或讓伺服器根據 RTT 推算的時間資訊
使用的武器與相關參數
伺服器收到這個指令後,會做以下幾件事:
這就是為什麼高 ping 玩家「還能命中」:因為伺服器主動把他的判定時間往回撥了。他瞄準的是過去的敵人,伺服器就回到過去幫他判定,兩者對齊,自然打得中。
反過來說,被高 ping 玩家打中的人會覺得莫名其妙,因為在他的視角裡,自己早就躲到掩體後面了。但伺服器回到過去一看,當時他確實還站在空地上,所以判定命中。這就是延遲補償最為人詬病、也最常被誤解的地方。
2.3 插值與外插:客戶端看到的世界從來不是即時的
很多人以為延遲補償只是在補網路延遲,其實不然,客戶端的插值(Interpolation)也是延遲補償要處理的一大來源。
由於伺服器更新頻率有限(例如 64 tick 或 128 tick),客戶端不可能每個畫面幀都收到新狀態。如果直接「收到什麼就顯示什麼」,角色移動會一格一格跳動,非常難看。因此客戶端會把收到的狀態排進一個小緩衝區,延遲一小段時間再播放,並在兩個狀態之間做平滑插值。這個「刻意延遲」通常設定在 1~2 個 tick 之間,常見值約 15~100 毫秒,視遊戲與設定而定。
換句話說,你螢幕上的世界,本來就比伺服器慢了一截。這不是 bug,而是為了畫面平滑必須付出的代價。延遲補償在計算回溯時間時,必須把這個插值延遲也算進去,否則高 ping 玩家會覺得「打中了卻沒傷害」,低 ping 玩家則會覺得「被空氣打死」。
有些遊戲還會使用外插(Extrapolation),也就是根據敵人的速度預測他下一步會在哪裡。外插可以減少視覺延遲,但預測錯誤時會造成角色「瞬移」或「回彈」,因此多數競技射擊遊戲傾向保守使用,甚至完全關閉外插,改用插值為主。
總結來說,延遲補償要對齊的時間軸至少包含三層:網路單程延遲、客戶端插值延遲、伺服器 tick 間隔。這也是為什麼不同遊戲的延遲補償手感差異很大——每一層的參數設定都不同。
三、主流遊戲怎麼做:從 Source 引擎到現代競技遊戲
延遲補償不是單一技術,而是一整套設計取捨。不同遊戲根據自身節奏、武器特性與競技需求,實作方式差異很大。以下介紹幾個代表性案例。
3.1 Source 引擎:經典的歷史快照回滾
《CS》系列、《TF2》、《L4D2》等 Source 引擎遊戲,可說是延遲補償最著名的實作之一。伺服器會保存每個玩家過去約 1 秒的位置歷史,當玩家開火時,伺服器根據該玩家的延遲與插值時間,計算出一個回溯量,然後把其他玩家「倒帶」到那個時間點進行射線檢測。
Source 引擎的延遲補償有幾個為人熟知的特性:
sv_maxunlag 控制,預設 1 秒。超過上限的玩家不會獲得更多補償,等於延遲再高也沒用,反而自己體驗更差。Source 引擎的做法奠定了後續許多 FPS 的基礎,也讓「lag compensation」這個詞進入一般玩家視野。
3.2 Overwatch 與 Valorant:競技化調校
《Overwatch》採用類似的回滾機制,伺服器會根據射手的延遲還原目標位置。由於 Overwatch 角色移動速度快、技能多,延遲補償的參數調校相對保守,避免出現過於誇張的「隔牆命中」。遊戲總監曾多次在訪談中說明,他們會在「高 ping 玩家的可玩性」與「低 ping 玩家的公平性」之間取得平衡。
《Valorant》則以 128 tick 伺服器為賣點,並針對「窺視者優勢」(Peeker's Advantage)做了不少調整。窺視者優勢指的是:主動探头的一方,因為延遲補償的關係,往往比架槍防守的一方更早看到對方。Valorant 的開發團隊曾公開討論這個問題,並透過網路程式碼與伺服器更新頻率的優化,試圖把優勢控制在合理範圍內。這也說明了一件事:延遲補償不只是技術問題,更是競技公平性的設計問題。
3.3 MOBA 與格鬥遊戲:不同的賽道
MOBA 類遊戲(如《英雄聯盟》、《Dota 2》)的操作節奏與 FPS 不同,技能多為指向性或範圍判定,對「像素級精準」的要求較低,因此延遲補償的重點往往放在指令緩衝與伺服器端判定,而非逐幀回滾。玩家按下技能時,指令會先在客戶端排隊,送到伺服器後由伺服器決定施放時機與命中與否。
格鬥遊戲則是另一個極端。格鬥遊戲要求 frame-perfect 的輸入精度,傳統的延遲補償做法會嚴重破壞手感。因此近年流行回滾網路代碼(Rollback Netcode),代表技術是 GGPO。它的做法是:客戶端先預測對手的輸入並繼續模擬,一旦收到對手的真實輸入且與預測不符,就「回滾」到過去某個幀重新模擬。這與 FPS 的伺服器回滾方向相反——FPS 是伺服器回滾敵人位置來判定命中,格鬥遊戲是客戶端回滾整個遊戲狀態來修正預測。兩者都叫 rollback,但實作邏輯大不相同。
理解這些差異很重要,因為當你在不同類型遊戲中遇到「延遲」問題時,背後的原因與解法可能完全不同。
四、高 ping 的優勢與代價:不是免費的午餐
網路上常有「高 ping 比較強」的說法,這句話對了一半,但也錯了一半。延遲補償確實會讓高 ping 玩家在某些情境下佔便宜,但同時也帶來明顯的代價。
4.1 為什麼高 ping 有時能「先開槍先贏」
想像一個情境:你 ping 200,敵人 ping 20,你們同時看到對方並開槍。在你的螢幕上,你先開火、先命中;但實際上,你的開火指令要花 100 毫秒才到伺服器,敵人的指令只要 10 毫秒。照理說敵人應該先被伺服器處理。然而,因為延遲補償的存在,伺服器會把你的判定時間往回撥約 200 毫秒,也就是回到「你開火那一刻看到的敵人位置」。
問題在於:你看到的敵人位置,其實是 200 多毫秒前的舊資料。你的「先開槍」是建立在一個過時的世界觀上;而敵人看到的是相對即時的世界。伺服器為了公平,選擇相信你的世界觀,於是你的命中被認可。這就是高 ping 玩家「感覺自己先打中」的來源。
更極端的情況是「窺視者優勢」。當你從掩體後探頭,你的客戶端會先預測你探出,並把這個動作送給伺服器;但敵人要等到伺服器更新、再經過他的插值延遲,才會看到你探頭。這段時間差讓主動探头的一方有機會先看到、先開槍。高 ping 玩家的時間差更大,優勢有時更明顯。
4.2 延遲補償的邊界:超過上限就沒戲唱
延遲補償不是萬靈丹,它有明確的邊界。首先是最大回溯上限,例如 Source 引擎的 1 秒。當你的延遲超過這個上限,伺服器不會再為你回滾更多,你的命中判定就會開始失真,出現「明明瞄準卻打不中」的狀況。
其次是封包遺失與抖動。延遲補償假設封包是穩定送達的,但如果你的網路劇烈抖動或大量掉包,伺服器收到的射擊指令可能延遲送達、順序錯亂,甚至根本沒收到。這時候回溯時間的估算就會失準,命中判定自然不穩定。
第三是自身體驗的惡化。高 ping 玩家雖然在命中判定上可能佔便宜,但他自己的畫面延遲、敵人瞬移、被反殺的挫折感也會加倍。你打中人,對方可能已經躲進掩體;你以為安全,卻被早已看到你的敵人預開。這種「資訊不對稱」的劣勢,往往比命中判定的優勢更影響勝負。
4.3 被反殺與架槍劣勢:延遲補償的雙面刃
延遲補償最常被抱怨的場景,就是「我已經躲進掩體了,卻還是被打死」。從防守方視角來看,這確實很不公平;但從系統視角來看,這是為了讓高 ping 玩家也能正常遊戲的必要之惡。
這也導致了「架槍者劣勢」的現象:固定站位、預瞄的玩家,往往比主動移動的玩家更容易被延遲補償「懲罰」。因為移動方的不斷改變位置,讓對手的畫面與伺服器狀態產生時間差,而延遲補償會把這個時間差轉化為攻擊方的優勢。
所以,高 ping 不是「比較強」,而是「風險與報酬的分布不同」。你在某些對槍情境下可能佔便宜,但在資訊獲取、反應速度、穩定性上都要付出代價。真正影響勝負的,還是遊戲理解、瞄準技術與戰術決策。
五、五個最常見的延遲補償誤解
延遲補償因為牽涉到網路與伺服器內部機制,長年被各種迷思包圍。以下整理五個最常見的誤解,幫助你建立正確觀念。
六、實戰建議:網路不理想時該怎麼打
理解了原理之後,最重要的還是回到實戰。以下幾個方向可以幫助你在延遲不理想時打得更好。
6.1 調整插值與網路設定
多數競技射擊遊戲都允許玩家調整插值相關參數。一般原則是:插值延遲不要設得太低,否則封包一抖動就會出現角色瞬移;也不要設得太高,否則畫面過度落後,手感變鈍。多數遊戲的預設值已經是不錯的平衡點,除非你非常確定自己的網路穩定,否則不建議隨意大幅調低。
另外,關閉背景佔用頻寬的程式、使用有線網路取代 Wi-Fi、選擇距離較近的伺服器區域,都是最直接有效的改善方式。
6.2 打法調整:減少對「完美時機」的依賴
高延遲環境下,與其追求「同時開槍先贏」,不如改變打法:
多利用預瞄與資訊優勢,減少需要即時反應的對槍。
避免長時間架槍在同一個點位,因為你可能被延遲補償「隔空帶走」。
善用煙霧、閃光等戰術道具,降低對精準命中的依賴。
主動移動、改變位置,讓對手更難預測你的出現時機。
說到底,延遲補償只是系統層面的補救,真正決定勝負的還是你對遊戲機制的理解與臨場決策。
七、結語:延遲補償是橋樑,不是魔法
回到最初的問題:為什麼高 ping 還能命中?答案是,伺服器透過歷史快照與回滾判定,主動把時間軸往回撥,讓射手的「過去視角」與伺服器的「現在狀態」對齊。這是一套精巧的工程設計,目的是讓不同網路條件的玩家能在同一個虛擬世界裡相對公平地競爭。
但它不是魔法。延遲補償有上限、有副作用,也無法解決所有網路問題。高 ping 玩家可能在某些時刻佔到便宜,卻必須承受更多的不穩定與資訊劣勢;低 ping 玩家雖然手感較好,也可能因為延遲補償而「被隔牆打死」。理解這套機制,不是為了抱怨,而是為了在現有條件下做出更好的判斷與調整。
下次當你又因為高 ping 被擊殺,或是在爛網路下莫名神準時,不妨想想背後的這套時光機機制。遊戲網路的世界從來不是「即時」的,而延遲補償,正是讓這個不完美的世界勉強運轉的那座橋樑。