加入收藏 | 设为首页 | 会员中心 | 我要投稿 泉州站长网 (https://www.0595zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长资讯 > 评论 > 正文

《GTA 5》祖传“屎山”代码终于修复

发布时间:2021-04-15 16:22:47 所属栏目:评论 来源:互联网
导读:1 分钟的时间分界线上,之前是加载的是单机和联机版通用的基础内容,之后是联机版独有的内容。 可以看到,联机版 GTA 5,加载时调用大量 CPU 资源至少长达 4 分钟之久,而同时,内存、GPU、硬盘的使用情况几乎没有明显变化。所以,问题大概率出在代码上。 黑

 1 分钟的时间分界线上,之前是加载的是单机和联机版通用的基础内容,之后是联机版独有的内容。

  可以看到,联机版 GTA 5,加载时调用大量 CPU 资源至少长达 4 分钟之久,而同时,内存、GPU、硬盘的使用情况几乎没有明显变化。所以,问题大概率出在代码上。

  黑客大哥说:我闻到一股烂代码的味道…..

  为了找出到底那一部分程序卡住了 CPU,他使用了工具 Luke Stackwalker,对 CPU 任务堆栈进行采样分析。沿着调用栈往下走,发现问题出在一个 sscanf 函数上scanf 的功能是读取格式化的字符串中的数据,而在 GTA 5 中,它正在读取的是一个 10M 左右,有 63000 多个条目的 JSON 文件。这个文件到底是干什么用的?黑客大哥推测,这可能是游戏内购商店的相关内容。

  再看第二个问题,这是一个存储命令,对象是 item,具体是什么不得而知。但是保存前,有一个 if 语句,逐一比较 item 内项目的哈希值,检查它们是否出现在某一列表中。按照他计算,这一步 if,要执行(63000^2+63000)/2 = 1984531500 次!没错,等待加载前的十多分钟里,GTA 5 用你的 CPU,执行了 19.8 亿次 if 命令...

  如此简单粗暴的编程思路,让这位老哥哭笑不得:既然对象有唯一哈希值,那为什么不用 hash map???

  至于R星为什么不修正,有网友推测,最开始,if 的循环次数并没有这么多,而是随着开发,条目不断增多,最后到了积重难返的地步。而之前的代码结构,谁也不愿意去动。

  就是这样一个低级的失误,让全球玩家至今每次打开游戏,都要上演一遍 19.8 亿次的 if 循环…这是不是堪称游戏开发史上最意外的“屎山”代码?

  如何冲掉“屎山”

  第一个问题,黑客大哥采用 hook 大法,不一一读取字符串,而是:hook strlen“缓存 “字符串起始和当前长度。如果在字符串范围内函数在此被调用,返回缓存的值。至于 if 语句问题,就更直接了——完全跳过重复检查,利用 hash map 插入项目,因为这些值是唯一的。

(编辑:泉州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读