打开GTA 5竟要跑19.8亿次if语句!黑客嘲讽R星代码烂,修改后直接省70%加载时间...

C++性能分析工具(Windows) 1. Luke Stackwalker 简介 Luke Stackwalker是免费使用的一款性能分析工具,VC6和VS的某些版本都支持性能分析,但是由于虚拟机没有管理员权限问题,导致分析工具无法使用。 2.Luke Stackwalker使用简介 (1)首先进行项目设置(需连接网络):运行的exe以及pdb路径 如下图所示: 分析菜单设置exe、pdb路径(2)其次是设置采样堆栈的层级... 阅读详情
贾浩楠 发自 凹非寺
量子位 报道 | 公众号 QbitAI

一支烟的功夫,GTA 5联机版终于打开了。

「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???

(hashmap根据hashCode值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序不确定。)

问题解决,加载时间节省70%

至于第一个问题,黑客大哥采用hook大法,不一一读取字符串,而是:

hook strlen
“缓存 “字符串起始和当前长度。
如果在字符串范围内函数在此被调用,返回缓存的值

至于if语句问题,就更直接了——完全跳过重复检查,利用hash map插入项目,因为这些值是唯一的。

最后的结果如下:

现在,GTA 5联机版加载,从原来的6分钟,下降到现在的1分50秒!而且,用的还是七八年前的硬件配置。

在此,应该手动@R星:你学废了吗?

这位黑客大哥在博文中没有留下任何身份信息,也没有透露用的反编译工具,但是做好事不留名的他,把打好包的工具上传到了Github,玩家通过一行代码就能下载:

git clone —recurse-submodules https://github.com/tostercx/GTAO_Booster_PoC

之后,把dll文件粘贴到游戏根目录下就OK!

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

Github地址:
https://github.com/tostercx/GTAO_Booster_PoC

近期热门文章

  • 你点的每个“在看”,我都认真当成了AI

Windows平台C++性能分析工具LukeStackWalker.zip 简单易用的Windows平台性能分析工具,与vc6以上的版本自带的性能分析工具功能类似。简单的几个步骤即可分析出C++程序的性能所在,没有Intel的VTune_Amplifier这么专业,但是对于Windows开发来说足够使用。 立即下载

相关推荐

Luke Stackwalker-开源

Luke StackWalker是Windows的基于GUI的C / C ++源代码分析器。 它在应用程序运行时对其应用程序的堆栈进行采样,以找出应用程序大部分时间都花在哪里。

7年无人敢动的「屎山」代码:if循环19.8亿次

你是不是也有这样的问题?????速戳看视频????黑马视频号你玩过“侠盗猎车手5”(简称GTA 5)这个游戏吗?这个游戏是由Rockstar Games游戏公司(被玩家称作R星)出版发...

传智播客的专栏 3万+

luke-stackwalker:借助力处理文件组的嵌套子组。 对于按时间点、通道、体积排序的较大图像文件集特别有用..

卢克·斯塔克沃克 借助力处理文件组的嵌套子组。 对于按时间点、通道、体积排序的较大图像文件集特别有用...... Luke Stackwalker 是一个托管在 GitHub 上的开源项目。

打开GTA 5竟要跑19.8亿次if语句!黑客嘲讽R星代码烂,修改后直接省70%加载时间

本文转载自 量子位 一支烟的功夫,GTA 5联机版终于打开了。 「7年了!GTA 5联机版加载还是这么慢??」 △Please wait forever to play Reddit、Steam、HackerNews上,无数玩家吐槽抱怨…… 进游戏少则等5、6分钟,多则20分钟。 终于,一个黑客大哥实在忍不了,用逆编译器逐条查看运行情况,终于找到原因。 原来,R星(游戏开发商RockStar)写的代码太低效,加载时,一个if语句竟然循环了19.8亿次…. 幕后黑手:谁占用大量时间? 加

m0_46163918的博客 4万+

StackWalkerExeption:C ++中的堆栈跟踪

StackWalkerExeption C ++中的堆栈跟踪 此自由使用了并添加了在引发异常后从异常访问堆栈跟踪的功能。 用法 在将StackWalker librery添加到您的项目中之后,添加Exception.h和Exception.cpp并包含头文件。 #include "Exception.h" try { throw Exception("Example exception") } catch(Exception& ex) { cout << ex.what() << endl; cout << ex.getStackTrace() << endl; } 它仍在进行中。 将会增加更多的老师,希望Windows和Linux上的GCC支持。

StackWalker

最新版本的StackWalker,用于检查内存泄露或野指针的工具。

程序员爆改《GTA OL》代码后加载速度快了 70%,R 星采纳并奖励 1 万美元

本文转载自 量子位,作者 贾浩楠 折磨全球无数GTA 5玩家的联机版超长加载时间问题,终于要修复了。 什么?R星(游戏开发商RockStar)主动改善玩家游戏体验?不存在的。 △Please wait forever to play 打开GTA 5联机版,要跑19.8亿次if语句,一支烟的功夫游戏都加载不完。 这堪称游戏开发史上最大的“屎山”代码,存在了7年,R星从没想过要修复…. 玩家对GTA 5联机版可谓又爱又恨,有人甚至破口大骂: 直到一位黑客大哥路过,实在忍不了恶臭的代码,嘲讽

m0_46163918的博客 2万+

c++性能分析

介绍c++语言性能的书籍,比较好

打开游戏要运行 19.8 亿次 if 语句?黑客嘲讽 RockStar 游戏代码太烂了

点击上方蓝色小字,关注“涛哥聊Python”重磅干货,第一时间送达转自:量子位一支烟的功夫,GTA 5联机版终于打开了。「7年了!GTA 5联机版加载还是这么慢??」△Please wai...

涛哥聊Python 1199

使用IDF和VSCode构建ESP32的开发环境

本文主要介绍构建使用IDF和VS-CODE 工具构建ESP32的开发环境的详细步骤,还应用IDF和VS CODE创建ESP32的项目文件,并实现编译和下载功能。

mftang的博客 6818

ArcGIS基础实战:面数据拓扑创建和错误修改全流程

通过下图的操作我们可以发现,图层的【Shape_Length】和【Shape_Area】字段的数值都发生了改变,表明两个图层重叠的那一部分图斑合并到另一个图班上,其面积会减小、长度会变大(自己重新计算一下也可以得到此验证结果的)。如图【拓扑实验结果】文件夹里右键,新建【文件地理数据库】,并进行命名为【xx拓扑检查】备注:养成良好的命名习惯。然后在【xx拓扑检查】下右键打开【新建要素数据集】,并对数据集进行命名为【XX拓扑】,然后进行下一步设置。在【KK拓扑】数据集上右键,新建【拓扑】。

yuanYW7556的博客 1万+

GTA 5祖传「屎山」代码终于修复!R星认可黑客方案,还给他发了1万美元奖金

贾浩楠 发自 凹非寺 量子位 报道 | 公众号 QbitAI折磨全球无数GTA 5玩家的联机版超长加载时间问题,终于要修复了。什么?R星(游戏开发商RockStar)主动改善玩家游戏体验?...

量子位 2154

压电阀控制器设计-总章

本文章用于回顾记录本人制作压电阀控制器的关键技术,本人所制作压电阀控制器已经上市得到应用,特在此对一些关键技术进行回顾记录,欢迎从事压电控制及压电阀相关人员一起讨论

qq_42712859的博客 849

打开游戏要运行19.8亿次 if 语句?黑客嘲讽RockStar游戏代码太烂了

点击关注公众号,回复“2T”获取2TB学习资源!互联网架构师后台回复2T有特别礼包上一篇:深夜看了张一鸣的微博,让我越想越后怕来源:量子位一支烟的功夫,GTA 5联机版终于打开了。「7...

emprere的博客 915

R语言生存分析之限制性立方样条分析:样条回归、和多项式回归有什么不同?是否存在非线性关系、限制性立方样条cox回归模型

R语言生存分析之限制性立方样条分析:样条回归、和多项式回归有什么不同?是否存在非线性关系、限制性立方样条cox回归模型

statistics+insight+vista+power 634

工具变量法入门:解决因果分析中的内生性问题

想知道如何在复杂的数据中精确揭示因果关系?你是否遇到过自变量与误差项相关导致的困惑?工具变量法将为你拨开迷雾,帮助你剖析数据背后的因果链条。这篇文章不仅详细讲解了工具变量法的原理,还结合实际案例,让你轻松掌握这一关键研究工具。点击阅读,开启你的因果分析新篇章!

theskylife的博客 1953
上一篇: Python实现“鸟脸识别”系统,看看什么鸟最贪吃~ 初学者也能学会
下一篇: Python迎来30岁生日,先驱Pablo Galindo:没想到Python这么流行
菜鸟学Python
博客等级 码龄9年 8062粉丝 571原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值