作者alihue (wanda wanda)
看板Soft_Job
标题[心得] 如何减少 GTA Online 70% 载入时间?(转)
时间Sat Mar 27 23:29:27 2021
原始文章:
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
读法是用 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.cc), 来自: 106.73.26.66 (日本)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Soft_Job/M.1616858969.A.62A.html
1F:推 ms0529876: 推 03/27 23:44
2F:推 APTON: 推 03/28 06:36
3F:推 ab4daa: 威 没有source 还能加速 03/28 11:27
4F:推 hduek153: 菜鸡表示strlen看不太懂 有人能解释一下吗 03/28 12:35
好像是当读取 10MB 的 JSON,读法是用 sscanf 一次读一个 char,
读完马上呼叫 strlen,再继续读下一个 char....
然後当要读的档案有 10mb 这麽大就有很重的 overhead
5F:推 tomap41017: 干谁写的烂扣 03/28 12:40
※ 编辑: alihue (106.73.26.66 日本), 03/28/2021 12:48:33
6F:→ fr75: 卖了几亿的公司只发了一万镁赏金 帮QQ 03/28 12:53
※ 编辑: alihue (106.73.26.66 日本), 03/28/2021 12:57:49
7F:推 peterbrucele: 看到linear scanf就头疼... 03/28 19:32
8F:→ peterbrucele: 更正 scan 03/28 19:32
9F:推 jasonwung: 厉害推 03/29 00:07
10F:推 viper9709: 推卖了几亿只发一万赏金XD 03/29 01:21
11F:推 Ofianse: 然後拿着这头衔看看能不能多赚几百万镁 03/29 02:01
12F:推 Sindragosa: 赞 03/29 10:13
13F:推 zrna0515: 推 03/29 10:58
14F:推 fbid: 所以每次strlen出来都是1? 03/29 18:12
15F:→ shooter555: 应该是加快strlen吧 先做好string cache 然後判断str 03/30 17:02
16F:→ shooter555: ring是哪一份cache里的就直接回整份cache的长度 就不 03/30 17:02
17F:→ shooter555: 用跑原本strlen一个字一个字判断结尾的动作 03/30 17:03
18F:→ shooter555: 话说用strstr会不会快一点 03/30 17:17
19F:→ shooter555: 前面看错了 他只是靠static cache前一次的point 03/30 17:18
20F:→ alihue: 我对於 strlen 那段理解是错的,详情请看另一篇版友回文 03/30 17:38
※ 编辑: alihue (106.73.26.66 日本), 03/30/2021 22:08:45
21F:→ ce173310: 既然确定是parse json,就可以省略检查有没有重复的步 04/08 21:38
22F:→ ce173310: 骤 04/08 21:38