折磨全球無數GTA 5玩家的聯機版超長加載時間問題,終于要修復了。
什么?R星(游戲開發商RockStar)主動改善玩家游戲體驗?不存在的,
打開GTA 5聯機版,要跑19.8億次if語句,一支煙的功夫游戲都加載不完,
這堪稱游戲開發史上最大的“屎山”代碼,存在了7年,R星從沒想過要修復….
玩家對GTA 5聯機版可謂又愛又恨,有人甚至破口大罵:
直到一位黑客大哥路過,實在忍不了惡臭的代碼,嘲諷完R星后,隨手按了“沖水鍵”,直接將等待時間壓縮70%。
鑒于R星失誤實在太低級太離譜,而這位老哥的方法又太有效,以致無數玩家稱他“功德無量”。
如果平均給每個玩家節省10秒,全球500萬玩家一天就能節約5000萬秒,一年中,節約的總時間大概能有數十年,相當于挽救了十多個人的生命!
R星這才坐不住了,趕忙官宣修復bug,不但采用了黑客的方案,還大方的給他獎勵了1萬美元“賞金”,
(注:所謂“屎山”,是程式員間流傳的一個梗,指陳年累月且復雜低效的代碼,因為改動成本巨大,所有人避之不及,)
黑客“治病救人”
不久前,量子位曾經介紹過黑客大哥通過逆編譯器檢查GTA 5,并且重寫代碼,一下節約70%加載時間的故事。
先來前情回顧一下,
簡單地說,就是GTA 5聯機版加載時間長得過分,有超過80%的玩家要等3分鐘以上,有的人甚至要等15-20分鐘。
一位黑客大哥實在忍不了,于是決定開扒GTA 5的代碼,看看到底是哪里出了問題。
首先,他用Windows任務管理器,來判斷聯機版GTA 5在啟動時,都調用了哪些計算機資源,
在1分鐘的時間分界線上,之前是加載的是單機和聯機版通用的基礎內容,之后是聯機版獨有的內容,
可以看到,聯機版GTA 5,加載時調用大量CPU資源至少長達4分鐘之久,而同時,內存、GPU、硬碟的使用情況幾乎沒有明顯變化。
所以,問題大概率出在代碼上,
黑客大哥說:
我聞到一股爛代碼的味道…..
為了找出到底那一部分程式卡住了CPU,他使用了工具Luke Stackwalker,對CPU任務堆棧進行采樣分析。
沿著調用棧往下走,發現問題出在一個sscanf函數上。
sscanf的功能是讀取格式化的字符串中的數據,而在GTA 5中,它正在讀取的是一個10M左右,有63000多個條目的JSON文件,
這個文件到底是干什么用的?黑客大哥推測,這可能是游戲內購商店的相關內容,
再看第二個問題,這是一個存儲命令,對象是item,具體是什么不得而知。
但是保存前,有一個if語句,逐一比較item內項目的哈希值,檢查它們是否出現在某一列表中,
按照他計算,這一步if,要執行(63000^2+63000)/2 = 1984531500次!
沒錯,等待加載前的十多分鐘里,GTA 5用你的CPU,執行了19.8億次if命令…
如此簡單粗暴的編程思路,讓這位老哥哭笑不得:
既然對象有唯一哈希值,那為什么不用hash map???
至于R星為什么不修正,有網友推測,最開始,if的循環次數并沒有這么多,而是隨著開發,條目不斷增多,最后到了積重難返的地步,
而之前的代碼結構,誰也不愿意去動,
就是這樣一個低級的失誤,讓全球玩家至今每次打開游戲,都要上演一遍19.8億次的if循環…
這是不是堪稱游戲開發史上最意外的“屎山”代碼?
如何沖掉“屎山”
第一個問題,黑客大哥采用hook大法,不一一讀取字符串,而是:
hook strlen“緩存 “字符串起始和當前長度,如果在字符串范圍內函數在此被調用,返回緩存的值
至于if語句問題,就更直接了——完全跳過重復檢查,利用hash map插入項目,因為這些值是唯一的。
最后的結果如下:
現在,GTA 5聯機版加載,從原來的6分鐘,下降到現在的1分50秒!
而且,他用的還是七八年前的硬件配置。CPU,是老而彌堅的AMD FX-8350,2012年上市,采用“推土機”架構,超頻潛力驚人。而顯卡,還是GTX 1070,
隨后他將修改好的代碼打包,上傳到了Github,免費供玩家下載。
但是,他也提醒玩家,私自改動游戲文件,可能有被封號的風險。他本人也面臨潛在的法律風險,
所以,他無論在部落格還是GitHub上,都沒有留下任何身份資訊。
黑客大哥提前拿了一筆“年終獎”
但是現在黑客大哥不用擔心了。
因為,這篇揭R星老底的帖子在全網大火,R星不得不出面應對。
在和他聯系后,R星認可了他的改進方法,宣布在后續更新中修復相關問題,并且還慷慨的給他付了一筆1萬美元的獎金。
“事了拂衣去,不留功與名”,這位黑客大哥被無數玩家膜拜。當然大家也不忘再把R星拖出來“鞭尸”。
有人吐槽,GTA 5僅2020年就買了2000萬份,累計銷量更是達到1.4億份,R星每年都能從這個項目上賺數億美元,但是卻不肯花幾分鐘去解決這么一個低級錯誤,實在可恥。
還有人抨擊R星幾乎從不與玩家社區互動,玩家提的意見也從來充耳不聞,直到這次被被黑客嘲諷打臉,才不得不出來表態。
事后,黑客大哥還透露了一絲身份資訊,原來他人在拉脫維亞,
拉脫維亞是波羅的海國家,原來是前蘇聯加盟國之一,在網上搜索相關資訊,可以發現“拉脫維亞黑客”,幾乎是和俄羅斯黑客一樣傳奇神秘的存在,
有網友爆料,在拉脫維亞,普通程式員工資平均3-4k歐元(23000-31000人民幣),
而他領到的這1萬美元獎金,相當于三四個月工資了,
提前領了一筆“年終獎”,黑客大哥表示很開心。同時他也說,將密切關注GTA 5未來更新,一絲不茍的檢查修復情況,
不知道他還能不能從R星領走更多獎金。