發行至今性能最強的《特戰英豪》伺服器是如何誕生的

一探開發團隊化危機為轉機,打造超猛伺服器的故事。

早在《特戰英豪》發行之前,提供每秒128更新率(128 tick)伺服器的服務就是團隊的首要任務。我們一直以來的目標,就是透過128-tick伺服器為所有玩家帶來世界級的競技遊戲體驗。想深入了解團隊是如何在發行前就達到這項目標,歡迎閱讀這篇技術文章:《特戰英豪》的128-tick伺服器

維持伺服器的效能表現是一項長期抗戰。隨著遊戲推出的功能日漸增加,我們也必須時時格外注意維持128-tick伺服器的運作是否會超出負荷。時間久了,微小的效能下降會日積月累,而偶爾出現的大幅效能下降則需要及時處理。

2022年8月,我們的伺服器發生了發行迄今最大的效能下降。這個問題影響的層面,除了《特戰英豪》的標準10人對戰以外,就連自訂對戰和電競比賽都受到波及。要解決伺服器的問題,就必須要結合工程師、製作人、高階主管以及位於伊斯坦堡的當地電競團隊共同努力,因為遊戲年度的最大競技盛事已經迫在眉睫。

在修復伺服器效能下降的同時,我們也一邊進行調查,並找到數個可以顯著改善伺服器畫格描繪需時的方法,最後經過眾人的努力,大幅改善了伺服器效能。5.07版本更新後,玩家所體驗到的《特戰英豪》128-tick伺服器,是自2020年6月遊戲推出以來最穩定的連線環境。

我是Aaron Cheney,是任職於《特戰英豪》效能團隊的工程師。本篇文章內容涵蓋的層面有:

  • 遊戲效能團隊如何察覺效能下降現象。
  • 2022冠軍賽舉辦之際發生的大型效能下降事件。
  • 審視我們的分類流程,深入了解團隊如何處理緊急問題,並解釋我們從這次事件中學到哪些教訓。

首先我會介紹團隊發現效能下降現象的方法,並稍微解釋所謂的「效能下降」究竟有多嚴重。

如何發現效能下降?

效能下降是開發遊戲必然會發生的現實。遊戲是由許多複雜的系統組成的,每個系統都像齒輪般,維繫整體功能的運作。其複雜程度,會隨著功能與系統的增加而日漸上升。因此重點就在於:效能下降發生時要準確檢測出來,並歸納出根本的原因。

《特戰英豪》有專屬的遊戲效能團隊負責相關事宜。團隊成員負責監控、維護並改善各個硬體規格上用戶端和伺服器的效能。我們透過各種工具與流程,及早發現效能下降,並在玩家感受到差異之前進行修正。

伺服器效能指標

維護128-tick伺服器的正常運作,代表伺服器一個畫格的停留時間必須控制在7.8125毫秒(ms)內,但要達成這條件,光是一場對戰就會占用整個CPU的核心。為了達到我們嚴格的128-tick條件和運行目標,《特戰英豪》的伺服器經過最佳化調整,能在7.8毫秒左右的時間內運行3個畫格,也就是說平均伺服器畫格描繪需時必須少於2.6毫秒。而我們實際的伺服器畫格描繪需時效能目標則是2.34毫秒。這項效能指標有兩個重要的目的:

  1. 能提供必要的空餘空間。在效能指標中擁有額外的空間,有助於補足較長的畫格描繪需時,不至於低於128-tick。不只能讓我們的伺服器具有應付各種狀況的彈性,也能為在伺服器上運行的作業系統、排程和其他軟體預留空間。
  2. 能幫助我們維持《特戰英豪》的經濟營運。伺服器設施是非常昂貴的支出。雖然每場《特戰英豪》的對戰都由單一硬體來執行會很酷,但就經濟層面來說並不是能夠永續經營的模式。

衡量現在,預測未來

遊戲效能團隊主要運用以下兩種資料,作為辨識效能下降的參照。

  1. 釋出前資料:這類型的資料有數種來源,包含:內部遊戲測試、自動產生測試以及PBE伺服器資料。
  2. 實際運行資料:這類型的資料來自全球玩家遊玩現行版本所產生的資料。

釋出前資料能讓我們分析尚未發行的遊戲內容與功能,預測未來的情況。這類型的資料比實際運行類的資料來得少,因此時常因為各種雜訊與變因而難以導出結論,而樣本一少,就難以掌握趨勢。極端案例也可能不會納入計算,儘管我們十分努力,但要詳盡測試完所有可能性依然是難如登天。

另一方面,實際運行資料能讓我們準確衡量玩家在遊戲中所見的內容,了解時下玩家的體驗。這類型的資料與內部資料相比,可說是龐大許多(數十億條的紀錄),如此巨量的數量相當難以處理,因此我們會匯總這些數據,並加以理解。

一般而言,釋出前資料能幫助我們防患未然,而實際運行資料則讓我們能根據當下實際情況及早反應。結合兩者的數據,就能掌握大多數的問題。

《特戰英豪》的標準對戰

絕大多數的《特戰英豪》玩家都是遊玩一般和競技模式。兩方其實都代表同一種遊戲模式,同樣是10名玩家進行遊戲,只有勝負的風險不同。雖然《特戰英豪》還有許多其他模式可玩(複製亂戰、輻能核心搶攻戰、死鬥模式等),但我們投注許多心力,確保輻能核心模式能帶來最佳的遊戲體驗。

《特戰英豪》中大多數的遊戲只需要10名玩家,然而部分特殊(且重要)的場合則會需要超過10名玩家參與。

《特戰英豪》的非標準對戰

在電競轉播賽事的場合,最多會有22個用戶端連線至輻能核心模式中。此時遊戲使用的是支援觀戰的自訂對戰,以供觀眾欣賞。在電競場合中,用戶端通常會包含以下分類:

  • 10個選手位(每隊5名選手)。
  • 2個教練位(每隊1名教練)。
  • 10個OB手位,由轉播團隊控制。有了這些額外的觀戰者視角,粉絲才能在家或體育館享受賽事並為之歡呼!

這種具有22個連線用戶端的場合,就能說是《特戰英豪》的非標準對戰了。伺服器必須要顧及每個連線至對戰中的用戶端,確保每個用戶端都能從伺服器接收在螢幕上顯示遊戲所需的資訊。在實際運行環境中,這樣的情況通常會有問題發生。但我們會使用為電競賽事專設的本地硬體,為選手們維持遊戲體驗的一致性。

《特戰英豪》非標準對戰的效能指標

還記得稍早提到的伺服器效能指標嗎?我們理想的每伺服器畫格描繪需時2.34毫秒目標,是根據《特戰英豪》標準10人對戰所設的。當連線的人數超過10人以上時,我們會預期效能將依照額外的連線人數呈線性下降。

舉例來說,22個用戶端的場合,平均畫格描繪需時會大概會增加2.2倍,從2.34毫秒變成5.2毫秒。這個數字還是遠低於維持128-tick伺服器所需的7.8毫秒標準。

根據我們處理《特戰英豪》非標準對戰的經驗,以及對《特戰英豪》伺服器效能的透徹理解,我們可以從標準遊戲中推斷性能數據,以準確分析並了解非標準遊戲的性能表現。

然而,萬一有任何變動會怎麼樣?萬一伺服器的效能表現,不再與連線的用戶端數量呈線性相關,會發生什麼事?

效能下降

時間回到2022年8月。當時,第一個徵兆出現在一場22個用戶端的遊戲測試中。進行測試的玩家發現伺服器畫格描繪需時出現波動,並且感受到遊戲過程出現不一致的情形。從對戰的錄影畫面中,可以明確看出事有蹊蹺。我們很幸運能在當下發現問題,因為當時22個用戶端的遊戲測試還沒有標準化。正當團隊人事更動、緊鑼密鼓地準備2022冠軍賽時,一位《特戰英豪》開發人員想起要向我們的測試供應商申請22個用戶端的遊戲測試。

雖然還不到拉響警報的程度,但我們也立刻著手確認問題,快速對問題進行分類,並努力建立修復程序。

確認問題

一個資料點並不足以代表趨勢。為了充分了解問題的嚴重性和影響範圍,我們首先處理來自實際環境的遙測數據,根據涉及的用戶端數量(從10到22個用戶端不等)來分類對戰數據。接下來的發現令我們為之震驚。

我們不知道確切原因為何,但圖表顯示連線的用戶端數量與伺服器效能之間,呈現非常令人擔憂的數字。這項問題與玩家數量呈現非線性的變化。

數據證實我們有個重大問題得處理——而且2022冠軍賽就快開始了,還會採用5.04版本作為比賽版本。因此警報正式拉響,我們立刻開始分類處理問題。

(這張圖表顯示各版本的伺服器畫格描繪需時。每條線代表用戶端的數量,從標準的10人對戰到最多22人的對戰。如我們所預期,每多一個用戶端連線,效能就會下降。然而5.03版本的圖形顯示伺服器的效能是以非線性形式下降。)

分類處理效能問題

分類處理問題的涵義,是在尚未完全了解根本原因的情況下減輕問題的影響。這種技術在醫學上用於評估病況和「止血」,Riot都是用這個方法來快速回應迫切的問題。

在分類問題時,會同時進行兩項工作。

建立應變計畫

首先,《特戰英豪》的高層會與我們伊斯坦堡的合作夥伴制訂應變計畫,用意是為了決定如果問題無法在2022冠軍賽開始前解決,下一步該怎麼辦。

既然知道問題的嚴重程度與用戶端的連線數量成正相關,那麼我們想知道的是:在不影響電競觀賽體驗的前提下,能將OB手的數量減少到什麼程度。22個用戶端已經是不可能了……所以理論上我們到底能使用多少用戶端呢?於是和電競部門的夥伴合作之下,我們決定採用15個用戶端,改為5名OB手,如此一來既能維持128-tick伺服器穩定,也能擁有良好的轉播體驗。正是因為我們在標準伺服器畫格描繪需時預留了彈性空間,這項作法才能奏效。

判斷問題根源

與此同時,《特戰英豪》開發人員也在持續進行調查,試圖釐清問題以及效能下降的根本原因。如此重大的問題,原因通常不太可能源自多個系統。

我們樂觀地希望自己會走運,能很快就找到根本起因,在2022冠軍賽開始前就修復問題。但天不從人願,最後並沒有成真。

修復效能下降

效能下降問題起初在2022年8月25日時發現,隨後在一週後修復。在這七天內,許多《特戰英豪》的工程師都一同投入,研究各種可行的解決辦法。

在調查開始的第一天,我們找出代碼庫中導致效能下降的地方:複寫。所謂「複寫」就是Unreal引擎確保伺服器與用戶端之間角色與物件參數同步的方法。想了解更多關於Unreal引擎的複寫系統,可以閱讀這篇文章

我們最初的優先事項,是分析5.02和5.03版本之間的改動,尋找複寫是否有受到更動的跡象。但這項工作十分困難,因為我們正好更新Unreal Engine至4.26版,許多核心功能也都一併有所改動。(想詳細了解關於《特戰英豪》Unreal Engine升級的方法,請查看這篇《特戰英豪》技術總監Marcus Reid的推文串。)

調查複寫不是一項簡單的工作。它不是一個需要《特戰英豪》開發人員特別關注的系統,因為我們早已建立了多年的最佳做法。同時它也並非由Riot工程師開發的系統,雖然我們有根據需求調整基礎引擎功能,但關於複寫方面的深度專業卻鮮為人知。

接著,我們有系統地拆解分析遊戲的各個部分,衡量5.02和5.03版本之間的差異,以縮小起因的範圍。我們利用Unreal的分析工具和Riot的內部工具來比較兩個版本之間的效能特質。最後我們導出的結論,就是5.03版本中角色、武器和技能的複寫次數,遠比5.02版本來得多。

這時我們嘗試了兩種途徑:

  1. 找出效能下降的源頭並加以修復。這是最理想的情況,也是我們努力的方向。
  2. 找出其他可以改善效能的方法。如果我們能找到其他可以改善效能的領域(足以彌補損失的畫格描繪需時),就可以將效能提升回可控範圍內,即使尚未找到並修復原本的問題也無妨。

因此多個工程師小組按照調查的線索,逐一測試可行的修復與改善方法。在此期間,許多工程師也逐漸熟悉並上手複寫的功能,同時也發現許多改善效能的方法,但經評估後實裝風險過高,因此便先行記錄,保存供未來使用。

在2022年9月1日,我們終於找到問題來源:一行UE 4.26引擎更新中的程式碼,導致複寫在《特戰英豪》執行時的特定情況下會多次頻繁觸發。這項錯誤導致效能下降,而且越多用戶端連線至伺服器後,情況便會加劇。這個問題在10個用戶端的標準對戰中就足夠明顯,在22個用戶端的對戰中更是導致對戰變得難以進行。 

找到效能下降問題,修復風險不大,我們也都有十足的信心。這是個兩全其美的辦法。我們沒有馬上開香檳慶祝,不過我們改寫了程式碼,也對結果相當滿意:

// <RGI> We handle this ForcePropertyCompare() call above. Adding it here (outside of the bNewlyReplicatesBlock)
// significantly increases the rate of comparisons, because the FScopedRoleDowngrades in UActorChannel::ReplicateActor() cause us to constant
//change the bReplicates flag and re-force comparisons.
// Here lies the sanity of 12 VAL devs.
// ForcePropertyCompare();
// </RGI>

效能下降事件之後

在找到效能下降的源頭,並加以修復後,我們進行了大規模的測試,確認效能已恢復至期望的水準,並確保更動沒有引發其他的錯誤。

實裝修復

雖然問題在2022年9月1日就發現並修復,但電競環境相關的改動一直到2022年9月8日,在小組賽後才正式實裝。這是為了利用更多時間進行測試與驗證,以降低風險和避免過度打擾伊斯坦堡的工作人員。

現行版本已經在5.05版本更新修復錯誤,並顯著提升效能。

2022冠軍賽之後

但5.05版本之後,精采的才正要開始。在調查複寫系統的那一週,我們也發現了許多可以改善效能的方法,並加以排程供後續開發。因為無法解決問題的根本原因,所以當時研判實裝這些改動的風險過大。在一開始的效能下降問題修復後,我們便利用新獲得的複寫知識,改善其他能增進伺服器效能的領域。

在眾人努力之下,最後大幅改善了整體的效能,與效能下降前的數字相比,整體伺服器的畫格描繪需時降低了15%。這些改動同時也減少了各地區之間的變數,進而增加伺服器畫格描繪需時的穩定度。

自5.07版本以來,99.3%以上的伺服器畫格描繪需時都符合我們嚴格的128-tick水準,也就是說,玩家現在正享受著《特戰英豪》上市以來品質最穩定的伺服器。

(這張圖表顯示各版本的伺服器畫格描繪需時。每條線代表用戶端的數量,從標準的10人對戰到最多22人的對戰。在5.03以及5.04版本的效能大幅下降事件後,我們修正了錯誤,並在5.05版本中恢復正常數值。接著在5.07版本中推出更多改善項目,可以見到此後的伺服器效能比起效能下降之前改善了15%。)

寶貴教訓

為了解決這個緊急的效能問題,我們動用了十幾名工程師、電競合作夥伴、測試供應商、製作人、團隊主管,以及慷慨的合作夥伴團隊為我們提供建議和指導。我們從這次的事件中學到許多,並發現我們的流程中也有著需要解決的問題。

  • 監控非標準對戰:以前我們的注意力都放在《特戰英豪》標準的10人輻能核心遊戲模式。我們的數據資料沒有根據連線的玩家數量進行細分,因此在創建新圖表之前,效能下降的規模是難以估計的。此後我們制訂了新流程,用以檢查與了解《特戰英豪》超過10個用戶端連線的非標準對戰的效能特徵。
  • 增加非標準對戰的測試範圍:標準的10人輻能核心模式仍會是我們主要的測試目標,但我們也正在建立全新測試程序,以了解22個用戶端環境的伺服器效能。22個用戶端對戰的樣本數,跟其他模式比起來根本是小巫見大巫,因此要收集相關資料,就得頻繁進行22個用戶端的遊戲測試。如今每次版本更新時,進行22個用戶端的遊戲測試已經是標準環節,而非是在重要比賽開始前才測試。我們可能也需要其他更為精確的測試流程。
  • 促進主題專家(Subject Matter Expert,SME)的發展:在團隊中納入主題專家雖然需要耗費大量時間,但可以幫助成員們補足知識上的不足,進而提升所有人的技術水準。在修復效能下降期間,多位工程師學會了複寫相關的知識技能,讓這次危機變成學習新事物的轉機。
  • 將大型賽事的風險降到最低:2022冠軍賽時,我們採用全新版本的作法相當有風險,尤其是才剛整合新版Unreal Engine的情況下。我們雖然希望玩法操作的更動(例如:平衡、角色等)能在大型賽事中實裝,但未來的賽事可能不會再採取如此有風險的作法。在不可抗力的情況下,我們也會盡力再三檢查各種風險。

我們日後仍會繼續努力不懈、改善遊戲,正如各位《特戰英豪》玩家努力增進技巧一般。祝大家享受128-tick伺服器,玩得愉快!