命中判定現況解析

我們的軟體工程師說明遊戲系統團隊如何改善命中判定的清晰度與正確度。

大家好,我是《特戰英豪》遊戲系統團隊的軟體工程師Kevin Lee。我們團隊負責開發《特戰英豪》遊戲體驗的移動、戰鬥、輸入等多項核心系統。在這篇文章中,我將為大家介紹FPS遊戲體驗中不可或缺的系統:命中判定

在《特戰英豪》這類遊戲裡,命中判定可說是最重要的系統,因為遊戲的輸贏可能只在一記爆頭之間。身為開發人員,我們的目標是要確保玩家的射擊結果清楚明瞭、符合預期,而且最重要的是要正確無誤。

我們有時會在玩家的發文或傳來的訊息中,看到命中判定表現異常的影片。我們非常重視每一則回報,也都會逐幀檢查影片,確認系統運行是否符合預期。

話雖如此,我們認為《特戰英豪》命中判定系統目前已經達到頗為理想的狀態。確實,系統中可能還是有一些很罕見的錯誤,我們仍會嚴正地看待及處理。我們也會繼續尋找機會,改善所有系統的品質與清晰度。

正確度VS清晰度

封測時的0.50版本中,命中判定的問題回報量大幅增加。看過玩家的回報、影片並經過長時間的內部測試後,我們成功發現了幾個命中判定的極端錯誤案例,但這些錯誤都不嚴重,不足以解釋回報數量大增的現象。經過進一步的調查,我們發現大部分影片呈現的都是清晰度的問題,而非正確度。影片中系統對於射擊的判斷皆屬正確,但射擊的視覺回饋卻使玩家對結果產生誤解。這也點出了正確度和清晰度之間的重要差異。

雖然兩者都是射擊「手感」的重要構成元素,但是……

  • 正確度指的是射擊結果判斷錯誤(例如:子彈擊頭部,卻被判定為擊中身體,或是敵方玩家在用戶端的顯示和伺服器不同)
  • 清晰度指的是射擊結果在視覺上不易判斷(例如:子彈擊中肩膀,但視覺回饋卻看起來像擊中頭部)
  • 正確度錯誤的嚴重程度遠高於清晰度錯誤

我們希望這篇文章能幫助大家了解這個系統,讓各位回頭檢視遊戲過程時,能正確解讀畫面中的射擊表現。我會概括講解系統的運作方式,並解釋從按下射擊鍵開始,到爆頭畫面出現為止的整個過程。

如要深入了解這個主題的技術面,請參考這篇關於《特戰英豪》網路傳輸編碼的Riot Tech部落格文章

我也會分析幾個常見的所謂「命中判定錯誤」回報案例,試著解釋案例的實際情況,以及我們針對清晰度採取的改善措施。

從擊發到爆頭

開始說明武器擊發當下的機制之前,我們必須先了解遊戲如何模擬戰鬥場景。《特戰英豪》的遊戲體驗經過兩層的模擬:首先是透過伺服器(模擬呈現結果以此為準),接著再由玩家的用戶端二度模擬(為了讓遊戲體驗更流暢,用戶端會預測伺服器結果)。

遊戲模擬包括組成遊戲世界的所有元素,像是玩家的位置、交戰使用的技能,以及戰場上的煙塵。每個畫面的生成,都是遊戲擷取模擬內容後,渲染呈現在螢幕上的結果。伺服器也會以相同的機制生成每個畫面(但會省略渲染的步驟,因為玩家不會看到伺服器畫面)。

好啦。所以當敵人從轉角探出頭,你用十字準星精確瞄準,鎖定對方頭部,然後按下滑鼠左鍵射擊……這時會發生什麼事?

hit_reg_flow.jpg

玩家按下按鍵時,輸入訊號會送入輸入系統(可能會有小幅的硬體/作業系統延遲)。在每個遊戲畫面,輸入系統都會處理上個畫面之後收到的所有輸入訊號。擊發武器時,「發射」的輸入訊號會與時間戳記一同傳送至伺服器,以便判斷射擊發生在模擬的哪一個畫面。

重點是,這個時間戳記是以《特戰英豪》收到輸入訊號時,當下顯示的畫面為主。現在,我們必須分別在用戶端模擬和伺服器模擬上追蹤這個射擊動作。

首先來看用戶端,也就是你的本機電腦。射擊動作一旦發送至伺服器,用戶端就會開始運作,在畫面上顯示槍口爆破和彈道。由於遊戲必須在你的螢幕上更新一幀畫面,因此送出輸入訊號後,最快要經過一幀,你才會看到槍口爆破和彈道。這一點很重要,因為顯示彈道的畫面,至少與收到發射訊號的畫面相差一幀,這兩者並不在同一幀畫面上。

有時射擊清晰度會因此產生問題。延遲子彈是解決畫面不同步的常見方法。我們不採取這種作法,因為延遲子彈會使輸入更加延遲,而《特戰英豪》想避免這樣的狀況。至於命中確認,用戶端會等待伺服器回覆結果,再顯示命中確認。為了確保所有使用者的體驗一致,並避免作弊玩家駭入用戶端偽造擊中結果,擊中結果一律由伺服器判定

另一方面,伺服器最終會從用戶端收到武器擊發的訊息。由於網路延遲的緣故,距離真正擊發武器已經過了一段時間。為了確認武器是在同一個模擬上擊發,伺服器會先將模擬倒轉至用戶端發送的時間戳記,再評估命中判定。這個步驟包括倒轉玩家的位置和動畫姿勢。接下來,伺服器會將結果傳送回用戶端。我們就假設在這個舉例裡,這次武器擊發的結果是爆頭!

用戶端會從伺服器接收到擊中結果,並根據結果播放視覺特效和音效。這個例子裡,遊戲會播放爆頭的視覺特效和音效。用戶端必須等待伺服器傳送擊中結果,所以彈道和命中特效之間會有時差,時差就等於你的連線來回時間(比如發送至伺服器需要40毫秒,則彈道和命中特效會相差80毫秒),再加上少量的處理時間。延遲越嚴重,時差就會越明顯。

我們目前正從清晰度著手,積極改善這個問題。

案例一:命中移動目標

Case_Study_1.gif


許多命中判斷的回報裡,目標都是奔跑狀態。我們來仔細看看武器成功命中奔跑目標的視覺畫面。我們可以看到,玩家成功對奔跑目標爆頭。為了讓各位更容易理解這個案例,用戶端的設定為60 FPS。從畫面可見,彈道出現前,十字準星對準了敵人的頭部。

case-study-1_frame-1.jpgcase-study-1_frame-2.jpg

但是在彈道出現的那一幀畫面就不是如此了。

case_study_1_part_2.gif

第二支短片也是同樣狀況,只不過這一發射擊差點就失誤。當我們一幀一幀播放影片,就能發現事實上,彈道出現的前一幀畫面裡,十字準星並沒有對準頭部,但是彈道出現的那幀畫面裡,準星就有對準。一開始,你可能會想把影片拉到彈道出現的畫面,大叫:「你看,這發完全就是爆頭啊!」但是檢視影片或畫面回放時,我們其實必須檢查彈道出現之前的那格畫面,因為那才是武器擊發的準確時間點。

case-study-1_part2_frame-1.jpgcase-study-1_part2_frame-2.jpg
case-study-1_part2_no-hit-vfx.jpg

讓我們再次回到武器命中的案例,看看命中視覺特效播放的那格畫面。由於網路延遲的緣故,玩家當下的位置以及命中視覺特效的位置有很明顯的差異。當你回過頭來檢視畫面,想必會覺得很奇怪,因為你很有可能只注意敵人當下的位置,忽略了武器擊發當下的位置。蹲伏姿勢和掃射的情況下,網路延遲肯定會造成更多問題(詳見案例二)。

case-study-1_part2_frame-where-hit-vfx-rendered.jpg

案例二說明了目前命中判定系統的清晰度仍有待加強。理想上,玩家就算不知道這些背景知識,也應該要能清楚判定狀況。身為開發人員,我們很清楚問題所在,也已經著手研究這些案例,設法改善清晰度。

案例二:蹲伏姿勢的命中視覺特效

假設你現在從遠距離加入一場槍戰,按住左鍵拿槍掃射,結果卻讓自己後悔莫及。你以為至少有一發子彈會命中敵人頭部,對吧?可惜啊,你用暴徒射中敵人身體三槍,造成117點傷害,結果反過來被敵人爆頭。

一怒之下,你在比賽結束後看了錄影,確定都是因為那糟糕的命中判定在搞鬼。你看到對手玩家不斷蹲伏想躲過你的子彈。但令人意外的是,你看到敵人採取蹲伏姿勢時,子彈正中他頭頂的命中視覺特效,對戰報告卻顯示擊中身體!怎麼會這樣??

請點擊下方連結,查看reddit上這篇貼文〈Headshots not registering when a player crouches(玩家蹲伏時,爆頭不算數)〉提出的假設。

我們的團隊調查不良命中判定的報告時發現,這種情況是最常見的兇手,造成了「看似」錯誤命中判定的狀況。事實上,命中判定一切正常。當你按下攻擊鍵,子彈確實打到你瞄準的地方(先不講彈道偏移或移動錯誤),伺服器也正確記錄了那一槍。

不過,有幾項因素造成這個案例產生視覺上的誤差。

  1. 命中視覺特效因網路延遲而發生延遲
  2. 命中視覺特效發生於原始中彈點
  3. 目標玩家移動了(大多是因為蹲伏)
Case_Study_2.gif

再舉一個例子,我們假設這為玩家PING值的是50。他在對手玩家肩部打中一槍。由於我們必須等待伺服器確認命中與否,當身體中槍的位置開始播放命中視覺特效,時間已經過了100毫秒。但在這100毫秒期間,對手玩家已開始蹲伏,把頭移到新生成的命中視覺特效正後方。在遠距離的激烈槍戰下,命中身體的視覺特效可能被誤認為爆頭視覺特效。

case-study-2_cursor-on-body.jpg case-study-2_hit-VFX-on-body-correctly.jpg case-study-2_player-crouches-into-vfx.jpg

這情況在封測時的0.50版本中尤其嚴重,當時所有玩家的血跡設定都因為錯誤而自行關閉,火花視覺特效也比較不清晰,造成難以區別是爆頭還是命中身體的視覺特效。我們針對命中身體和爆頭一直都使用不同的視覺特效,但也了解到在戰鬥中,這兩種視覺特效有時難以區分。

我們正積極改善這種命中判定清晰度上的錯誤。我們正在實驗的其中一個方法是,將命中視覺特效固定於角色中彈的身體部位,這樣即使發生嚴重延遲,也能看清楚相對位置。

以下是我們目前無血跡爆頭視覺特效與命中身體視覺特效的比較圖:

headshot-VFX.jpgbody-shot-VFX.jpg

預定的清晰度改善

這兩個案例點出了我們目前命中確認視覺特效的不足之處。我們正反覆測試的其中一項變更是,根據角色的中彈的身體部位產生血跡和火花效果,並隨著他們移動。如此一來,對於案例二這種敵人採取蹲伏姿勢的情況,將可大幅提升視覺上的清晰度,因為特效會隨著他們的身體移動。

不過這個方法有個缺點,那就是如果中彈的角色躲到掩體後方,視覺特效可能也會跟著移動過去。假設PING值100毫秒的玩家朝著躲在角落不停探頭窺視的玩家射擊。如果他們擊中敵人,結果對方在伺服器傳回命中確認前,馬上躲到角落後面,開槍者就無法在第一時間看到命中確認。

我們想過增添多重特效,部分特效隨著角色移動,其他的則生成在中彈的位置(根據用戶端模擬),藉此減輕這個問題的影響。但如果用戶端和伺服器模擬對射擊結果判定不一致,便會造成混淆:視覺效果必須清楚指出命中位置,才能讓射擊結果一目瞭然。

我們會繼續反覆測試這個作法和其他改善清晰度的方法,希望很快能在日後的更新版本中推出一套清晰度更新。

歡迎繼續投稿影片

希望這篇文章能讓你更清楚《特戰英豪》命中判定的運作方式,以及我們做此判定的原因。歡迎隨時投稿影片給我們,告訴我們你覺得命中判定錯誤的地方,我們會盡可能查看所有投稿影片。

即使你沒有遇到問題,這也能幫助我們在發生命中判定錯誤的情形時,更快找出問題(每次看到熱門的reddit文章中有「命中判定」這幾個字,我都會心跳加速)。

這個reddit連結提供了命中判定錯誤的例子