大家好,我是安德魯-弗裏德蘭(Andrew Friedland),命運2工程團隊技術負責人,我們負責多項事務包括命運2的獎勵系統。我最終領導了關於Perk權重問題調查的編程工作,並且向大家介紹我們這邊發生的情況。
我們社區團隊將此問題上報給我們的時機實際上相當巧合。當這個問題首次出現在我們團隊的關注列表中時,團隊的一名工程師文森特·戴維斯(Vincent Davies)剛剛寫完了一個腳本,這個腳本的用處是幫助我們驗證"前線"中新一代護甲的屬性分佈,稍作修改,我們就能夠使用這個腳本幫助我們驗證武器的Perk分佈,模擬每分鐘數千次掉落並記錄數據供我們分析。使用這個工具,我們也能夠快速驗證社區的發現。
我們的發現是?雖然單個Perk的概率是均等的,但成對Perk的概率卻並非如此。
以下是10w次VS 冰冷抑制掉落測試的結果。正如社區發現的那樣,有些Perk組合比較常見,有些不太常見,有些幾乎不可能獲得。
爲了理解這裏發生了什麼,我們首先需要深入探討一些數學和計算機科學知識,來定義我們所說的“隨機”是什麼意思。
什麼是隨機
真正的隨機事件是指我們可以爲其分配概率但無法預測的事情。這包括拋硬幣或擲骰子等事件,以及更廣泛的物理現象,例如閃電擊中哪裏或放射性原子何時衰變。對於所有這些,我們可以對某事發生的可能性做出一般性預測,但我們無法準確預測會發生什麼。我們也無法在我們想要的時候重複某個結果。計算機本身無法做到真正的隨機,當需要真正的隨機性時,人們求助於大氣噪聲(例如收音機或電視上的靜態噪聲)、宇宙背景輻射的記錄,甚至熔岩燈的圖案。然而,大多數事情並不需要真正的隨機數,對於遊戲而言,我們通常不希望有真正的隨機性,因爲我們無法控制它。
很多年前,一些聰明人提出了僞隨機數生成器 (PRNG) 的概念。僞隨機的基本思想是,給定一個種子數(通常是當前系統時間),我們可以運行一系列數學運算來得到一個相當隨機的數。然後,你可以使用這個新數作爲下一個隨機數的種子,最終得到一個足夠隨機的數列。
僞隨機相比真隨機數在遊戲中的一個巨大優勢在於其可重複性。使用相同的初始種子,你將始終獲得相同的數字序列,這意味着如果你擁有相同的初始種子和相同的輸入,遊戲結果將相同。遊戲利用這一點用於許多不同的用途,從保存遊戲到公平競賽等等。
僞隨機 的一個主要缺點,正如其名稱所示,是它們是僞隨機的。僞隨機 的輸出中可能會出現"模式",並且根據你的使用方法,你最終可能會放大這些模式,而不是得到看起來隨機的東西。
爲了幫助大家更好地理解各種算法,我將使用由我們的工程總監 喬-文森(Joe Venzon) 幫忙生成的示例數據。我們將從僞隨機的基本用例開始,使用 1 作爲第一個種子,然後使用最後一個結果作爲下一個值的種子。這將產生一個漂亮的點雲,沒有明顯的可識別模式,類似於舊電視屏幕上的雪花。這正是我們想要的,因爲它意味着我們的隨機數在可能性空間中相當均勻地分佈,並且在查看我們的數字序列時不應該有任何明顯的模式。
不幸的是,在 Destiny 中,我們不能總是將之前的結果作爲下一個種子反饋進來。在生成新的隨機數時,有很多地方需要穩定可預測的種子,而這種新的種子選擇最終導致了我們的問題。
這個BUG
在《命運 2》中,我們爲物品創建了分別名爲插槽和組件的新系統。此係統處理玩家視爲裝備的大部分內容,包括武器Perk、模組、着色器、大師強化,甚至是護甲屬性。隨機物品在《遺落之族》添加,它們主要通過插槽和組件系統運作。《命運 2》中的武器會有槍管、彈匣和其他Perk的插槽。當我們拾取該武器時,我們會從可用組件列表中選擇組件插入這些插槽,而這些組件分別代表你熟悉的Perk。去年“鍛造狂潮(仙器時代)”的混亂局面,都要歸功於這個系統的靈活性。
玩家可以根據自己的操作或獲取方式,在同一件物品上啓用不同的插槽,就像最初的製造護甲的實現方式一樣。這意味着在初始化新的掉落物時,我們無法假設總是以相同的順序初始化插槽。爲了確保商人爲所有玩家都提供相同的Perk組合,即時玩家有更多的插槽,我們爲每個要初始化的插槽使用不同的種子。不幸的是,這種爲了增加穩定性而做的額外工作最終導致了我們的錯誤。
爲了爲物品上的每個插槽選擇穩定的種子,我們最終將許多不同的信息片段組合在一起,使用哈希函數,這是一種將大量數據轉換爲單個數字的數學方法。雖然這個新的哈希數字如我們最初設想的那樣保證穩定,但由於插槽索引是添加到哈希中的最後一個片段,我們經常最終得到哈希值連續的情況,而這些連續的種子最終導致了壞的結果。
回到我們的表格,讓我們從觀察連續數字的哈希值開始。雖然哈希值本身並不連續,但我們可以看到輸出數字中一些相當明顯的模式。這意味着當我們查看連續數字的哈希值時,我們很可能能夠在輸出的哈希值中找到模式。雖然這本身並非壞事,但這確實意味着我們輸入 PRNG 的數據中存在一些有趣的模式。
如果我們將這些數字輸入隨機數生成器,我們會發現輸入數據中的這些模式破壞了我們的輸出,導致數據中出現一些模式。這些模式具體來說就是導致一些Perk組合很容易獲得,而另一些卻幾乎不可能找到的原因。
早期沙盒調查
終極問題:你爲什麼沒有早點調查 RNG?
每次我們看到玩家反饋中關於難以獲得特定組合的武器時,我們的沙盒團隊都會首先查看武器數據。武器的Perk從來沒有任何故意設置的權重,並且在缺乏更多證據的情況下,我們就此作罷。
隨機數生成在遊戲中(實際上對所有遊戲來說)都處於非常底層且基礎的層面,如果沒有明確或充分的證據表明存在問題,那麼指派工程師進行調查並不總是明智的。如果這樣的問題頻繁出現且顯而易見,我們早就應該注意到了,對吧?
就像所有遊戲開發一樣,這是一個優先級和權衡的問題。許多工程師和質量保證人員都專注於打造《命運》的未來。如果將他們的優先事項轉移到一個可能並非真正問題的領域,這將付出一定的成本,並且可能會影響到那些正在開發中的功能和內容。
在這種情況下,圍繞數據收集工作而組織起來的社區,有力地證明存在問題,我們需要對 RNG 代碼進行更深入的調查。
調查發現,這個問題在遊戲中存在已有一段時間,但直到最近才引起玩家社區的廣泛關注和重視。玩家開始主要關注鐵旗的 多機系統CCX 衝鋒槍和 晚星之主 的 VS 寒冷抑制 重型榴彈發射器。
儘管這個 bug 影響了所有武器,但它有時也會導致更容易獲得理想的Perk——因此在一段時間內沒有被注意到。
幾個相互重疊的問題導致了這種情況:
- 問題在Perk池爲6*6的武器上最爲嚴重。
- 多年來,出現同樣情況的武器擁有更多或更少的Perk組,在一定程度上掩蓋了這個問題的影響。
- 多排Perk很大程度上緩解了隨機數導致的壞結果。
- 專家武器和列表武器都有多排Perk
- 大多數的終局武器來源,例如試煉,Raid,日落都有專家版本。
- 玩家可以通過重置聲望來獲得多排獎勵。
- 對於可鍛造的武器來說,這個Bug無關緊要,自從《邪姬魅影》加入鍛造系統以來已經應用到了大多數的非終局武器來源。
最終,我們的社區隨着時間的推移收集到了足夠的證據,證明即使在權重相同的Perk設置下,也存在更深層次的問題需要解決。
修復
本-湯普森(Ben Thompsom),我們資歷較深的一位工程師,幾乎立刻就意識到了這個問題。對於任何在最初的冥冥低語任務發佈時就在玩的人來說,你可能還記得曾遇到過無法觸發“Taken Blight”公共事件的問題(又是卡巴爾?!)。事實證明,這裏潛在的問題與此類似,我們當時使用的是順序輸入來爲隨機數生成器提供種子。在那時,以及在這裏的解決方案都是將我們的哈希輸入乘以很大的素數以更好地分配它們,也稱爲數據加鹽。雖然順序輸入之間仍然會有一個規律的步長,但現在兩個順序輸入之間的實際值差異顯著,因此我們避免了一些模式問題。當我們對這些加鹽的輸入進行哈希運算時,最終會得到一系列分佈得更好的哈希值。
當我們將加鹽的哈希值輸入隨機數生成器時,我們再次得到一個漂亮的點雲,沒有任何明顯可辨別的模式。
回到我們最初使用 VS Chill Inhibitor 的測試案例,修復後我們的Perk分佈看起來如何?所有Perk組合出現的幾率相對均勻,與隨機事件的樣本預期存在一些輕微的偏差。現在獲得任何特定Perk組合的概率應該接近真正的隨機,正如最初的設計意圖。
Perk選擇修復已在 8.1.0.4 更新中上線,我們計劃很快對代碼庫的多個區域進行審計,以查找任何類似問題。總而言之,這些經驗教訓將使我們能夠防止此類問題再次發生,或者至少能夠幫助我們不時進行更好的抽查,以確保錯誤不會再次出現。我要感謝社區成員令人印象深刻的數據收集工作,這幫助我們識別出潛伏在現在相當古老且經過驗證的代碼中的這個相當隱蔽的問題。
更多遊戲資訊請關註:電玩幫遊戲資訊專區
電玩幫圖文攻略 www.vgover.com