PTT推薦

[心得] 如何減少 GTA Online 70% 載入時間?(轉)

看板Soft_Job標題[心得] 如何減少 GTA Online 70% 載入時間?(轉)作者
alihue
(wanda wanda)
時間推噓12 推:12 噓:0 →:10

原始文章: https://nee.lv/2021/02/28/How-I-cut-GTA-Online-loading-times-by-70/


如何減少 GTA Online 70% 載入時間?

作者覺得 GTA Online 載入時間機八久,因此想要一探究竟


首先作者做 benchmark 發現

Story mode load time: ~1m 10s
Online mode load time: ~6m flat

然後看看 cpu usage 同時在這段時間燃燒



第一步,作者先做 profiling 可以得知哪一些 function 佔了最多 CPU 資源

第二步,用 disassembler 去看程式碼



問題1. It’s… strlen?!

好像會 parse 一個高達 10MB 的 json 檔案,其中包含 63k items

這些資料是遊戲中的線上商城的

問題不是 10MB,而是讀取資料的方式

https://i.imgur.com/ZHLlEDJ.png

圖 如何減少 GTA Online 70% 載入時間?(轉)

讀法是用 sscanf 一次讀一個 char,讀完馬上呼叫 strlen,

再繼續讀下一個 char....

然後當要讀的檔案有 10mb 這麼大就有很重的 overhead


更新: 這段是錯的 請見另一位版友回文


問題2. Let’s use a Hash- … Array?

有一段 code 是讀取資料,判斷是否存在 array 中 (linear scan),然後儲存

然後如果資料有 ~63k,則會有 1984531500 次判斷,然後大部分沒用

為什麼不用 hash map!!!!



POC

作者寫了一個 .dll 然後 inject 到 GTA

問題1.解法;

- hook strlen
- wait for a long string
-“cache” the start and length of it
- if it’s called again within the string’s range, return cached value


問題2.解法;

移除重複的判斷,然後直接塞值 (因為已經知道值一定唯一)



結果: 效能增進 70%


最後 GTA 開發商採用了這個,並給出 10k 的獎金





---

心得

覺得這篇的 troubleshooting 思考脈絡與技巧非常強 很值得細讀



--

※ PTT留言評論
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 106.73.26.66 (日本)
PTT 網址

ms052987603/27 23:44

APTON03/28 06:36

ab4daa03/28 11:27威 沒有source 還能加速

hduek15303/28 12:35菜雞表示strlen看不太懂 有人能解釋一下嗎

好像是當讀取 10MB 的 JSON,讀法是用 sscanf 一次讀一個 char, 讀完馬上呼叫 strlen,再繼續讀下一個 char.... 然後當要讀的檔案有 10mb 這麼大就有很重的 overhead

tomap4101703/28 12:40幹誰寫的爛扣

※ 編輯: alihue (106.73.26.66 日本), 03/28/2021 12:48:33

fr7503/28 12:53賣了幾億的公司只發了一萬鎂賞金 幫QQ

※ 編輯: alihue (106.73.26.66 日本), 03/28/2021 12:57:49

peterbrucele03/28 19:32看到linear scanf就頭疼...

peterbrucele03/28 19:32更正 scan

jasonwung03/29 00:07厲害推

viper970903/29 01:21推賣了幾億只發一萬賞金XD

Ofianse03/29 02:01然後拿著這頭銜看看能不能多賺幾百萬鎂

Sindragosa03/29 10:13

zrna051503/29 10:58

fbid03/29 18:12所以每次strlen出來都是1?

shooter55503/30 17:02應該是加快strlen吧 先做好string cache 然後判斷str

shooter55503/30 17:02ring是哪一份cache裡的就直接回整份cache的長度 就不

shooter55503/30 17:03用跑原本strlen一個字一個字判斷結尾的動作

shooter55503/30 17:17話說用strstr會不會快一點

shooter55503/30 17:18前面看錯了 他只是靠static cache前一次的point

alihue03/30 17:38我對於 strlen 那段理解是錯的,詳情請看另一篇版友回文

※ 編輯: alihue (106.73.26.66 日本), 03/30/2021 22:08:45

ce17331004/08 21:38既然確定是parse json,就可以省略檢查有沒有重複的步

ce17331004/08 21:38