GTA 5祖傳「屎山」程式碼終於修復!R星最終採用駭客方案

賈浩楠 發自 凹非寺

量子位 報道 | 公眾號 QbitAI

折磨全球無數GTA 5玩家的

聯機版超長載入時間

問題,終於要修復了。

什麼?R星(遊戲開發商RockStar)主動改善玩家遊戲體驗?不存在的。

GTA 5祖傳「屎山」程式碼終於修復!R星最終採用駭客方案

Please wait forever to play

開啟GTA 5聯機版,要跑

19.8億次if語句

,一支菸的功夫遊戲都載入不完。

這堪稱遊戲開發史上最大的“屎山”程式碼,存在了

7年

,R星從沒想過要修復…。

玩家對GTA 5聯機版可謂又愛又恨,有人甚至破口大罵:

GTA 5祖傳「屎山」程式碼終於修復!R星最終採用駭客方案

直到一位駭客大哥路過,實在忍不了惡臭的程式碼,嘲諷完R星後,隨手按了“沖水鍵”,直接將等待時間

壓縮70%

鑑於R星失誤實在太低階太離譜,而這位老哥的方法又太有效,以致無數玩家稱他“功德無量”。

如果平均給每個玩家節省10秒,全球500萬玩家一天就能節約5000萬秒,一年中,節約的總時間大概能有數十年。相當於挽救了十多個人的生命!

R星這才坐不住了,趕忙官宣修復bug,不但採用了駭客的方案,還大方的給他獎勵了1萬美元“賞金”。

(注:所謂“屎山”,是程式設計師間流傳的一個梗,指陳年累月且複雜低效的程式碼,因為改動成本巨大,所有人避之不及。)

駭客“治病救人”

不久前,量子位曾經介紹過駭客大哥透過逆編譯器檢查GTA 5,並且重寫程式碼,一下節約70%載入時間的故事。

先來前情回顧一下。

簡單地說,就是GTA 5聯機版載入時間長得過分,有超過80%的玩家要等3分鐘以上,有的人甚至要等15-20分鐘。

GTA 5祖傳「屎山」程式碼終於修復!R星最終採用駭客方案

一位駭客大哥實在忍不了,於是決定開扒GTA 5的程式碼,看看到底是哪裡出了問題。

首先,他用Windows任務管理器,來判斷聯機版GTA 5在啟動時,都呼叫了哪些計算機資源。

GTA 5祖傳「屎山」程式碼終於修復!R星最終採用駭客方案

在1分鐘的時間分界線上,之前是載入的是單機和聯機版通用的基礎內容,之後是聯機版獨有的內容。

可以看到,聯機版GTA 5,載入時呼叫大量CPU資源至少長達4分鐘之久,而同時,記憶體、GPU、硬碟的使用情況幾乎沒有明顯變化。

所以,問題大機率出在程式碼上。

駭客大哥說:

我聞到一股爛程式碼的味道…。。

為了找出到底那一部分程式卡住了CPU,他使用了工具

駭客“治病救人”

,對CPU任務堆疊進行取樣分析。

沿著呼叫棧往下走,發現問題出在一個

Luke Stackwalker

函式上。

GTA 5祖傳「屎山」程式碼終於修復!R星最終採用駭客方案

sscanf的功能是讀取格式化的字串中的資料,而在GTA 5中,它正在讀取的是一個10M左右,有63000多個條目的JSON檔案。

這個檔案到底是幹什麼用的?駭客大哥推測,這可能是

sscanf

再看第二個問題,這是一個儲存命令,物件是

遊戲內購商店的相關內容

,具體是什麼不得而知。

但是儲存前,有一個if語句,逐一比較item內專案的雜湊值,檢查它們是否出現在某一列表中。

按照他計算,這一步if,要執行(63000^2+63000)/2 =

item

次!

沒錯,等待載入前的十多分鐘裡,GTA 5用你的CPU,執行了19。8億次if命令。。。

如此簡單粗暴的程式設計思路,讓這位老哥哭笑不得:

既然物件有唯一雜湊值,那為什麼不用

1984531500

???

GTA 5祖傳「屎山」程式碼終於修復!R星最終採用駭客方案

至於R星為什麼不修正,有網友推測,最開始,if的迴圈次數並沒有這麼多,而是隨著開發,條目不斷增多,最後到了積重難返的地步。

而之前的程式碼結構,誰也不願意去動。

就是這樣一個低階的失誤,讓全球玩家至今每次開啟遊戲,都要上演一遍19。8億次的if迴圈…

這是不是堪稱遊戲開發史上最意外的“屎山”程式碼?

hash map

第一個問題,駭客大哥採用hook大法,不一一讀取字串,而是:

hook strlen

“快取 “字串起始和當前長度。

如果在字串範圍內函式在此被呼叫,返回快取的值

至於if語句問題,就更直接了——完全跳過重複檢查,利用hash map插入專案,因為這些值是唯一的。

最後的結果如下:

GTA 5祖傳「屎山」程式碼終於修復!R星最終採用駭客方案

現在,GTA 5聯機版載入,從原來的6分鐘,下降到現在的1分50秒!

而且,他用的還是七八年前的硬體配置。CPU,是老而彌堅的AMD FX-8350,2012年上市,採用“推土機”架構,超頻潛力驚人。而顯示卡,還是GTX 1070。

隨後他將修改好的程式碼打包,上傳到了GitHub,免費供玩家下載。

但是,他也提醒玩家,私自改動遊戲檔案,可能有被封號的風險。他本人也面臨潛在的法律風險。

所以,他無論在部落格還是GitHub上,都沒有留下任何身份資訊。

如何沖掉“屎山”

但是現在駭客大哥不用擔心了。

因為,這篇揭R星老底的帖子在全網大火,R星不得不出面應對。

在和他聯絡後,R星認可了他的改進方法,宣佈在後續更新中修復相關問題,並且還慷慨的給他付了一筆

如何沖掉“屎山”

的獎金。

GTA 5祖傳「屎山」程式碼終於修復!R星最終採用駭客方案

“事了拂衣去,不留功與名”,這位駭客大哥被無數玩家膜拜。當然大家也不忘再把R星拖出來“鞭屍”。

有人吐槽,GTA 5僅2020年就買了2000萬份,累計銷量更是達到1。4億份,R星每年都能從這個專案上賺數億美元,但是卻不肯花幾分鐘去解決這麼一個低階錯誤,實在可恥。

GTA 5祖傳「屎山」程式碼終於修復!R星最終採用駭客方案

還有人抨擊R星幾乎從不與玩家社群互動,玩家提的意見也從來充耳不聞,直到這次被被駭客嘲諷打臉,才不得不出來表態。

事後,駭客大哥還透露了一絲身份資訊,原來他人在拉脫維亞。

拉脫維亞是波羅的海國家,原來是前蘇聯加盟國之一。在網上搜索相關資訊,可以發現“拉脫維亞駭客”,幾乎是和俄羅斯駭客一樣傳奇神秘的存在。

GTA 5祖傳「屎山」程式碼終於修復!R星最終採用駭客方案

有網友爆料,在拉脫維亞,普通程式設計師工資平均3-4k歐元(23000-31000人民幣)。

而他領到的這1萬美元獎金,相當於三四個月工資了。

提前領了一筆“年終獎”,駭客大哥表示很開心。同時他也說,將密切關注GTA 5未來更新,一絲不苟的檢查修復情況。

不知道他還能不能從R星領走更多獎金

GTA 5祖傳「屎山」程式碼終於修復!R星最終採用駭客方案