GTA5联机版终于打开了,黑客修改后节省70%加载时间。

7年了!GTA 5联机版加载仍是这么慢?
Please wait forever to play

Reddit、Steam、HackerNews上,许多玩家吐槽抱怨……

进游戏少则等5、6分钟,多则20分钟。

总算,一个黑客大哥实在忍不了,用逆编译器逐条查看作业情况,总算找到原因。

原本,R星(游戏开发商RockStar)写的代码太低效,加载时,一个if句子居然循环了19.8亿次….

背地里黑手:谁占用许多时刻?
加载GTA 5 Online究竟有多慢?
硬件拉满的土豪玩家请无视
Reddit相关板块建议的查询中,超越80%的玩家,都要等3分钟以上,有的乃至超越15分钟。

并且,从7年前Online上线到今日,这个情况一点点没有改进。

浮躁的,现已骂起了脏话……
但奇怪的是,如果你挑选是故事形式(单机版),加载就会快许多,感觉乃至像两个不同的作业室开发的游戏。
详细到这位黑客大哥的比如,他自己的硬件配备如下:
CPU,是老而弥坚的AMD FX-8350,2012年上市,选用“推土机”架构,超频潜力惊人。

显卡仍是GTX 1070。

这样今日看起来老旧的配备,打开单机版GTA 5需求1分10秒,而加载联机版则6分钟起。

黑客大哥用了最简略的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???

R星搞了什么屎代码呢?就是你有一个字典(hash map)然后你想找到一个key对应的的value,怎么做应该不必说了吧,可是R星蛇皮操作了铢积寸累变成了屎山

他用for 循环字典的key值,用if判别当key与方针key相一同,回来对应的value。。。
(hashmap依据hashCode值存储数据,大多数情况下能够直接定位到它的值,因而具有很快的访问速度,但遍历次序不确定。)

问题解决,加载时刻节省70%
至于第一个问题,黑客大哥选用hook大法,纷歧一读取字符串,而是:

hook strlen
“缓存 “字符串开端和当时长度。
如果在字符串范围内函数在此被调用,回来缓存的值
至于if句子问题,就更直接了——完全越过重复查看,使用hash map刺进项目,因为这些值是仅有的。
现在,GTA 5联机版加载,从原本的6分钟,下降到现在的1分50秒!并且,用的仍是七八年前的硬件配备。