0

黑客教R星做游戏?上架了8年的GTA5,竟连10M的文件都搞不定?

2021-03-05 14:50:21 神评论

大家好,这里是正惊游戏,我是你们的正惊小弟。

GTA5作为一款老游戏,可能很多玩家都有玩过。不过有些玩单机版的玩家可能不知道,GTA5的联机版也就是GTA5 online游戏加载情况却被人诟病已久。

就这么说吧,对于大众游戏,除去第一次的内容解压,一般玩家第二次打开游戏界面,游戏内容加载也就在10-30秒,配置差一点的玩家可能在1分钟。但是这款2013年的游戏却让高配置玩家等待3-6分钟,差一点的配置玩家可能需要10分钟甚至更久。

也就是说当你双击游戏图标时点开一支烟,这根烟抽完了你才刚刚进入游戏……

或许有些玩家觉得这款游戏太费烟,开始较真起来,其中以国外的一个ID为T0ST的黑客大佬为代表,他好好的分析了一下GTA5游戏打开时的程序后台的电脑资源占用情况。

所谓是内行看门道,这位黑客发现自己的GTX1070+FX8350联机版打开竟然需要6分钟,于是开始着手一篇优化GTA5OL的博客。

大佬在博客中写到,GTA5OL运行时在这漫长的6分钟里,程序的有一行代码被执行了1.98亿次。这行代码就是程序里常用的判断语句,也就是if...else语句,换做文字就是“如果是,则执行“这样的语句,而且这段代码使用的架构非常奇怪和低效。

至于这行代码为什么要执行这么多遍,这位老哥也顶着掉头发的风险,使用专门的工具测了出来,发现罪魁祸首就是一个仅有10m大小的文件。根据文件内容猜测,似乎是在线商店物品列表。GTA5启动时,必须将这个文件从头到尾查阅一遍甚至多遍。

这个大概是什么概念呢,小弟简单计算,理想状态下一个if语句要读取50个字节长度的内容需要1毫秒,那么读取完这个10m的文件就需要整整200秒,也就是3分钟左右。这还仅仅是这一个文件的读取,更不用提数个G大小的游戏本体了……

为了读取完这个10M大小的文件,再将读取的结果进行储存,R星程序员竟然简单的用的if语句进行比对,这段if代码计算下来执行了(63000^2+63000)/2 = 1984531500次!

你抽一根烟的功夫,你电脑的CPU把这段代码悄悄执行了将近20亿次。更加噩梦的是,如果R星在商店里增加新东西,这段代码的执行次数还会以指数级进行增加!

小弟打个比喻,这感觉大概就像是,你本来和妹子的约会地点10分钟就能到,结果你脑子秀逗了,在家门口来回转圈了19.8亿次,才去找妹子,让妹子硬生生多等了你60分钟。

不过非常可疑的是,GTA5上线至今R星竟然从来没有考虑过优化这段代码。黑客大佬又在伴随着头发掉落的声音独自研究起这段反编译后的代码,发现了一个致命的问题,就是这个文件的读取明明存在着更有效率的方法。

于是这位黑客大佬使用了代码中的hook strlen+hash map的方法,将这个文件的读取和储存过程进行了优化。

如果让小弟用“人话”来描述就是,把这个文件看做一个小区,每个数据看成每户人家,cpu想要做人口普查(读取数据),可以根据直接找到对应的的门牌号然后进行数据读取,再用小本本记录下来(储存数据)。下次想要再读取这家内容,直接看本本,不用每家每户再敲一次门,大大提升了数据的读取和存储效率。

也就是这个方法的添加,自己的游戏启动现在只需要1分50秒就能加载完成,相比较之前的6分钟效率提高了70%。那么相比较来看,之前R星的这段祖传代码,完全就是“屎山”(比喻极其糟糕的代码)。

这位大佬还把这段程序开源放在了github上,玩家如果需要可以自行下载。

而且有意思的是,在这段反编译后的源码中,竟然出现了大量的TODO字样,一般在IT公司中这些都是给实习生或者新人做的工作,国外网友打趣道:这家伙竟然发现了R星分配给了实习生的活啊!

之后这位黑客大佬的行为在国外论坛和新闻上被广泛传播,很多玩家表示想要给大佬打CALL,并强烈建议大佬开通打赏功能,因为这件事实在是解决了大家一个扎心的痛点。更有人建议作者给R星发邮件。

15.jpg

不过大佬表示现在R星肯定已经看到了,这样做可能会让一部分人陷入麻烦,在社交媒体上公布已经足够了。

可以给作者捐赠咖啡钱

相比较R星的直接搁置这个事情的优化不同,隔壁的《地平线4》开发团队就显得有诚意的多。在很多玩家吐槽加载时间长时,其开发团队在数次更新中优化此类问题。玩家也发现加载时间由原来的几分钟到现在的一分钟甚至秒进,简直有了飞一般的速度。

那么网友们对于黑客大佬优化GTA5OL加载时间的这件事又是怎么看的呢?

——有人应该尝试计算等待诸如此类的笨拙代码所浪费的时间。在这么多玩家的陪伴下,我敢打赌它至少有千年的历史。

——我确定R星现在很可能会拿这个补丁来卖钱。

——如果修复了这个加载时间,就能在商店加更多东西了不是嘛?

(花费一亿美元的开发工作,竟然在读取二进制文件之前没有对文件进行基本的分析)

——6分钟的加载时间?我会等疯了的

——我觉得肯定是很多程序员的才华被R星埋没了

——是不是GTA3开始这段代码就没有变过,太辣鸡了

看到这里小弟跟你讲,小弟终于知道GTA5开发时间为什么有5年了,大概全都浪费在了游戏启动上。

最后一个正惊问题:你的GTA5OL启动要多久?

【编辑:给你吃饼干】

热门新闻排行