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

「7年了!GTA 5联机版加载还是这么慢??一个if语句循环了19.8亿次??你的CPU在抽烟」你以为我上GitHub就是在学习?你以为我上GTA5就一定是在玩游戏?「7年了!GTA5联机版加载还是这么慢??」别急先献上地址https://github.com/tostercx/GTAO_Booster_PoC详情下面慢慢去了解只需要如下操作:gitclone—recurse-submoduleshttps://github.com/tostercx/GTAO_Booster_PoC之后,把dll文件粘贴到游戏根目录下就OK!彻底提升启动速度70%△Pleasewaitfor

大家好,又见面了,我是你们的朋友全栈君。

你以为我上GitHub就是在学习?你以为我上GTA5就一定是在玩游戏?

「7年了!GTA 5联机版加载还是这么慢??」
别急 先献上地址https://github.com/tostercx/GTAO_Booster_PoC
详情下面慢慢去了解
只需要如下操作:
git clone —recurse-submodules https://github.com/tostercx/GTAO_Booster_PoC之后,把dll文件粘贴到游戏根目录下就OK!彻底提升启动速度70%

在这里插入图片描述△Please wait forever to play

在给他爱5中,玩家进入线上模式通常需要七八分钟,甚至十几分钟,这取决于你的电脑配置,然而在单机模式却只需要一分钟左右,这让人怀疑,这两个模式不是一个游戏。
Reddit相关板块发起的调查中,超过80%的玩家,都要等3分钟以上,有的甚至超过15分钟。
而且,从7年前Online上线到今天,这个情况丝毫没有改善。
暴躁的,已经骂起了脏话……
在这里插入图片描述
终于一个大神玩家T0ST实在忍不了,用逆编译器逐条查看运行情况,终于找到原因。
原来,R星(游戏开发商RockStar)写的代码太低效,加载时,一个if语句竟然循环了19.8亿次….
幕后黑手:谁占用大量时间?
加载GTA 5 Online到底有多慢?

但奇怪的是,如果你选择是故事模式(单机版),加载就会快很多,感觉甚至像两个不同的工作室开发的游戏。
在这里插入图片描述
根据他的的说法,《GTAOL》在启动时游戏存在单线程CPU的瓶颈问题,这会影响大多数中低端CPU。当然光是这点无法解释高端配置运行游戏也存在加载速度慢的问题,于是他通过专业代码拆解工具发现《GTAOL》程序在运行时会“纠结”在一个大小10MB的JSON文件文件身上,虽然不知道这文件的作用,但是它会让你的CPU反复执行上亿次if命令,这效率之低可想而知。
在这里插入图片描述
于是大神T0ST编写了一个.dll,将其导入进《GTA5》游戏中,并成功让《GTAOL》加载到线上的时间缩短了70%

大哥首先用了最简单的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???

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

目前这位大哥已经把文件打包放在的GitHub上,只需要去下载就可以

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/131597.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 第四章:hadoop 启动wordcount实例,包括hadoop自带jar包和eclipsejar包。hdfs常用命令[通俗易懂]

    第四章:hadoop 启动wordcount实例,包括hadoop自带jar包和eclipsejar包。hdfs常用命令[通俗易懂]第四章:hadoop 启动wordcount实例,包括hadoop自带jar包和eclipsejar包。hdfs常用命令

    2022年4月23日
    44
  • mysql分区表_MySQL分区表的正确使用方法

    mysql分区表_MySQL分区表的正确使用方法MySQL分区表概述我们经常遇到一张表里面保存了上亿甚至过十亿的记录,这些表里面保存了大量的历史记录。对于这些历史数据的清理是一个非常头疼事情,由于所有的数据都一个普通的表里。所以只能是启用一个或多个带where条件的delete语句去删除(一般where条件是时间)。这对数据库的造成了很大压力。即使我们把这些删除了,但底层的数据文件并没有变小。面对这类问题,最有效的方法就是在使用分区表。最常…

    2022年6月4日
    28
  • 标量tensor转numpy数组时在pycharm调试下显示异常「建议收藏」

    标量tensor转numpy数组时在pycharm调试下显示异常「建议收藏」最近发现了一个问题,在标量tensor转numpy数组之后,在pycharm调试的过程中,我想看一下这个数组的值,却发现显示异常。importnumpyasnpimporttorcha=torch.tensor(5)b=a.numpy()print(b)如上面这个代码,在断点调试的时候,b这个数组的array显示出现异常可能还是numpy的数组在定义显示的时候,是根据shape来的吧,而这个时候这个shape是一个空值,所以就有了这个无法显示的异常。解决的方

    2022年10月19日
    0
  • mysql 查看函数fsync_sync/fsync/fdatasync的简单比较

    mysql 查看函数fsync_sync/fsync/fdatasync的简单比较此文主要转载自官网上有关于MySQL的flushmethod的设置参数说明,但可能很多人不太明白。下文就详细说明此问题。首先官网的说明如下:http://dev.mysql.com/doc/refman/5.6/en/innodb-parameters.html#sysvar_innodb_flush_methodinnodb_flush_methodCommand-LineFormat–i…

    2022年5月31日
    32
  • html分页样式居中,bootstrap分页样式怎么实现?

    html分页样式居中,bootstrap分页样式怎么实现?bootstrap分页样式怎么实现?下面本篇文章给大家介绍一下bootstrap分页的实现。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。任何一个网页里面,我们都可以看到分页,不管是移动端,还是pc端,不管是下拉到下一页,还是按钮下一页,都需要分页支撑你的网站。这样首先,可以提高你的网站的访问效率;另外页面展现也更加好看,要不然,上百万的上千万的数据;显示估计一两个小时也显示不出…

    2022年7月17日
    10
  • 64位CENTOS 5(RED HAT AS5)安装配置(web服务、邮件服务、WEB邮件)小记

    64位CENTOS 5(RED HAT AS5)安装配置(web服务、邮件服务、WEB邮件)小记

    2021年7月25日
    41

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号