回到文章清單
20/08/06開發幕後

命中判定現況解析

分享:

大家好,我是《特戰英豪》遊戲系統團隊的軟體工程師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連結提供了命中判定錯誤的例子

我們等你

相關內容