格兰特·阿托米卡(Grand Theft Auto)无需介绍,它是一款由Rockstar制作的流行的开放世界游戏。正如你已经知道的,我是一位逆向工程爱好者,因此我喜欢阅读某些游戏/应用的代码,因为这有助于我学习它们如何解决“现实世界”问题。这次我正在学习GTA Vice City的代码。它也适用于PlayStation 2硬件,这意味着开发者仅限于32MB的主内存、300MHz的CPU(著名的Emotion Engine)和约4MB的GPU。另外,还有5MB/s的DVD驱动器,花费半秒钟移动激光头:] [!] 些技术收获: - 代码几乎从未分配内存。 完全避免堆栈遍历和内存碎片化,几乎所有游戏对象都生活在一个连续的、预先分配的内存池中(例如,准确地140个行人,110辆车)。 - 重放系统仅占用1MB的内存。 他们使用不到1MB的内存构建了一个完整的30秒世界重放功能。它通过严重量化世界状态到小型类型包(压缩复杂行人动画到一个字节)并在播放时进行位置插值,而不是运行物理来实现。 - 2002年ECS生成器实现。 解决开放世界中的悬垂指针问题(没有现代智能指针或引用计数),Rockstar使用了一个自定义数据句柄机制。他们将一个槽索引和一个7位的生成计数器打包到一个整数中。整个东西(句柄)是32位的。 - 电梯算法(C-SCAN)。 只有5MB/s的DVD读取速度和巨大的寻址时间惩罚,I/O系统并没有按照请求顺序读取文件。相反,它按物理扇区位置排序资产,并以激光头通过时顺序读取它们。 - 世界网格和智能碰撞检测。 整个城市映射到一个静态分配的80x80 2D数组(每个单元50米)。每个单元包含侵入性链接列表,用于实体,使大型碰撞查询(如子弹射线或爆炸)降低到简单的指针运算和短列表遍历。使用一个非常聪明的O(1)优化的访问标志技巧。 - 反盗版破坏。 而不是崩溃游戏,内置的拷贝保护触发器随机翻转全局状态检查,导致微妙的、令人恼火的游戏问题:禁用狙击手的子弹,35分钟后破坏任务车库,或永久性地损坏生成后72,000帧(20-40分钟游戏时间)的保存文件。查看完整视频分解,包括实际C++代码,手写PS2向量单元汇编,以及每个技巧/机制的详细说明。全视频:https://www.youtube.com/watch?v=gqUmXuDIDbc