你以為我上GitHub就是在學習?你以為我上GTA5就一定是在玩游戲?
「7年了!GTA 5聯機版加載還是這么慢??」
別急 先獻上地址https://github.com/tostercx/GTAO_Booster_PoC
詳情下面慢慢去了解
只需要如下操作:
git clone —recurse-submodules https://github.com/tostercx/GTAO_Booster_PoC之后,把dll檔案粘貼到游戲根目錄下就OK!徹底提升啟動速度70%
△Please wait forever to play
在給他愛5中,玩家進入線上模式通常需要七八分鐘,甚至十幾分鐘,這取決于你的電腦配置,然而在單機模式卻只需要一分鐘左右,這讓人懷疑,這兩個模式不是一個游戲,
Reddit相關板塊發起的調查中,超過80%的玩家,都要等3分鐘以上,有的甚至超過15分鐘,
而且,從7年前Online上線到今天,這個情況絲毫沒有改善,
暴躁的,已經罵起了臟話……

終于一個大神玩家T0ST實在忍不了,用逆編譯器逐條查看運行情況,終于找到原因,
原來,R星(游戲開發商RockStar)寫的代碼太低效,加載時,一個if陳述句竟然回圈了19.8億次….
幕后黑手:誰占用大量時間?
加載GTA 5 Online到底有多慢?
但奇怪的是,如果你選擇是故事模式(單機版),加載就會快很多,感覺甚至像兩個不同的作業室開發的游戲,

根據他的的說法,《GTAOL》在啟動時游戲存在單執行緒CPU的瓶頸問題,這會影響大多數中低端CPU,當然光是這點無法解釋高端配置運行游戲也存在加載速度慢的問題,于是他通過專業代碼拆解工具發現《GTAOL》程式在運行時會“糾結”在一個大小10MB的JSON檔案檔案身上,雖然不知道這檔案的作用,但是它會讓你的CPU反復執行上億次if命令,這效率之低可想而知,

于是大神T0ST撰寫了一個.dll,將其匯入進《GTA5》游戲中,并成功讓《GTAOL》加載到線上的時間縮短了70%
大哥首先用了最簡單的Windows任務管理器,來判斷聯機版GTA 5在啟動時,都呼叫了哪些計算機資源,
在1分鐘的時間分界線上,之前是加載的是單機和聯機版通用的基礎內容,之后是聯機版獨有的內容,
可以看到,聯機版GTA 5,加載時呼叫大量CPU資源至少長達4分鐘之久,
而同時,記憶體、GPU、硬碟的使用情況幾乎沒有明顯變化,
所以,問題大概率出在代碼上,
“R星代碼寫太爛!”
黑客大哥在開扒R星代碼之前,就說:我聞到一股爛代碼的味道……
為了找出到底那一部分程式卡住了CPU,他使用了工具Luke Stackwalker,對CPU任務堆疊進行采樣分析,
Luke Stackwalker對于閉源應用程式,可以轉存正在運行的行程堆疊,和當前指令指標的位置,以一定時間間隔建立一個呼叫樹,
最后將資料整合,就可以得到程式運行統計資料,
從結果上看,一共有兩個函式“卡住”了CPU:

于是他使用專業的代碼拆解工具,給GTA 5來了一個“開膛破肚”,
沿著呼叫堆疊往下走,發現問題出在一個sscanf函式上,
sscanf的功能是讀取格式化的字串中的資料,而在GTA 5中,它正在讀取的是一個10M左右,有63000多個條目的JSON檔案,
這個檔案到底是干什么用的?黑客大哥推測,這可能是游戲內購商店的相關內容,
在具體運行時,sscanf對于每個有效值,逐個讀取每一個字符,然后回傳結果,之后指標移向下一個值,回圈往復……直到把10M檔案全部掃一遍,

再看第二個問題,這是一個存盤命令,物件是item,具體是什么不得而知,
但是保存前,有一個if陳述句,逐一比較item內專案的哈希值,檢查它們是否出現在某一串列中,
按照他的計算,這一步if,要執行(63000^2+63000)/2 = 1984531500次!
沒錯,等待加載前的十多分鐘里,GTA 5用你的CPU,執行了19.8億次if命令,
如此簡單粗暴的編程思路,讓這位老哥哭笑不得:
既然物件有唯一哈希值,那為什么不用hash map???
現在,GTA 5聯機版加載,從原來的6分鐘,下降到現在的1分50秒!而且這位大哥,用的還是七八年前的硬體配置,
目前這位大哥已經把檔案打包放在的GitHub上,只需要去下載就可以
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/266739.html
標籤:其他
下一篇:[藍橋杯2018決賽]迷宮與陷阱
