点击关注公众号,回复“2T”获取2TB学习资源!

互联网架构师后台回复 2T 有特别礼包

上一篇:深夜看了张一鸣的微博,让我越想越后怕

来源:量子位

一支烟的功夫,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!

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

感谢您的阅读,也欢迎您发表关于这篇文章的任何建议,关注我,技术不迷茫!小编到你上高速。

· END ·

最后,关注公众号互联网架构师,在后台回复:2T,可以获取我整理的 Java 系列面试题和答案,非常齐全。

正文结束

推荐阅读 ↓↓↓

1.不认命,从10年流水线工人,到谷歌上班的程序媛,一位湖南妹子的励志故事

2.如何才能成为优秀的架构师?

3.从零开始搭建创业公司后台技术栈

4.程序员一般可以从什么平台接私活?

5.37岁程序员被裁,120天没找到工作,无奈去小公司,结果懵了...

6.IntelliJ IDEA 2019.3 首个最新访问版本发布,新特性抢先看

7.这封“领导痛批95后下属”的邮件,句句扎心!

8.15张图看懂瞎忙和高效的区别!

一个人学习、工作很迷茫?

点击「阅读原文」加入我们的小圈子!

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

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

    贾浩楠 发自 凹非寺 量子位 报道 | 公众号 QbitAI 博客原文 https://nee.lv/2021/02/28/How-I-cut-GTA-Online-loading-times-by- ...

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

    本文转载自 量子位 一支烟的功夫,GTA 5联机版终于打开了. 「7年了!GTA 5联机版加载还是这么慢??」 △Please wait forever to play Reddit.Steam.Ha ...

  3. 堵你妹游戏开发之六 游戏的运行逻辑

    整个游戏的运行逻辑可以分为两个部分,一个是游戏的运行界面,一个是选关界面以及购买的弹出界面. 游戏的运行界面就其实很简单.主要的过程是: 第一:生产汽车.设置在屏幕的不同地方生产汽车.使用schedu ...

  4. 「7年了!GTA 5联机版加载还是这么慢??一个if语句循环了19.8亿次??你的CPU在抽烟」

    你以为我上GitHub就是在学习?你以为我上GTA5就一定是在玩游戏? 「7年了!GTA 5联机版加载还是这么慢??」 别急 先献上地址https://github.com/tostercx/GTAO ...

  5. 微信开源「派大星」:4000元游戏电脑能带动7亿参数GPT!

    来源:量子位 一听到训练大模型,是不是第一感觉就是贵.烧钱.玩不起? 但我说,一台4000多块钱的游戏电脑,谁都能训练上亿参数的大模型呢? 别不信,这是真的. 而这就归功于微信AI团队,最近推出的一款 ...

  6. 网易Q2季报图解:游戏营收重回百亿 净利同比降29%

    雷帝网 雷建平 8月9日报道 网易(Nasdaq:NTES)今天公布财报.财报显示,网易2018年第二季度净收入162.84亿元(约合24.61亿美元),同比增长21.7%: 净利润21亿元(约合3. ...

  7. 计算机游戏攻略70,70亿人攻略大全 七十亿人全关卡双星代码通关攻略

    70亿人是一款逻辑编程游戏,玩家们需要使用代码来安排员工们工作喔,很多玩家可能想知道70亿人攻略大全.七十亿人全关卡双星通关攻略呢,跑跑车游戏网为大家带来了介绍. *70亿人攻略大全 [通关原则] · ...

  8. PS4二战在线游戏连接不上服务器,使命召唤14:二战打不开怎么办 游戏无法运行解决办法汇总...

    使命召唤14:二战是<使命召唤>系列的全新续作,一些玩家在下载未加密版的游戏后会遇到使命召唤14打不开.使命召唤14无法运行.使命召唤14未响应等等问题,其实这些问题并不是游戏本身的问题, ...

  9. win10玩cf不能全屏_如何优化Win10游戏流畅运行?Win10游戏流畅运行优化教程

    很多小伙伴们在安装了win10操作系统之后,运行游戏的过程中可能就会遇到游戏卡顿不流畅的情况.如何优化Win10游戏流畅运行?在这里小编为大家准备了一些解决游戏卡顿的小妙招,一起看下吧~ 如何优化Wi ...

  10. 构建、运行、增长,亚马逊云科技发布游戏行业解决方案

    云计算除了为游戏提供底层基础设施的IT资源,还能做什么? 编辑 | 宋慧 出品 | CSDN云计算 在全球游戏发展重塑的过程中,中国已经成为全球最大的数字游戏市场,Data.ai发布2022年Leve ...

最新文章

  1. 集锦 | 新冠图像数据分析论文集合
  2. Xamarin提示Build-tools版本过老
  3. 【Nginx-20180108】Nginx的搭建文件服务器问题一则
  4. P1582 倒水(二进制)
  5. React 之 高阶组件的理解
  6. 力扣长度最小的子数组
  7. Chart/Report资源目录
  8. 在Python中检测*可用* CPU数量的便携方式
  9. mysql开通访问权限_mysql 用户远程访问权限开通
  10. HTML之文本相关标签
  11. Ubuntu20安装gcc11
  12. python毕业设计作品基于django框架外卖点餐系统毕设成品(6)开题答辩PPT
  13. 亲完如何进行下一步_接吻进阶指南,提出接吻,亲吻技巧,约会后怎么接吻
  14. 中科院计算机研究所排名,中国科学院计算技术研究所
  15. Flask PyMongo的基本使用
  16. 如何成为高效的学习高手
  17. OpenGL---GLUT教程(一) GLUT简介,体系
  18. DAY2作业-假如生活欺骗了你!
  19. Python+Yolov5人脸口罩识别
  20. android屏幕解锁图案,安卓手机图案屏幕锁解锁方法!!

热门文章

  1. iOS底层探索之多线程(六)—GCD源码分析(sync 同步函数、async 异步函数)
  2. Service Work生命周期
  3. ionic3学习之懒加载
  4. Keras 多层感知机 多类别的 softmax 分类模型代码
  5. 洛谷P1134 阶乘问题[数论]
  6. 【Python】Tanimoto相似度算法实现
  7. 【LeetCode】141. Linked List Cycle (2 solutions)
  8. 文件异步上传方式(二)
  9. linux 基础命令汇总
  10. 5901和5909在P570中的功用