How Rockstar fit an entire city into PlayStation 2 memory

Lobsters Hottest 新闻

摘要

文章详细剖析了Rockstar如何通过流式加载、LOD、内存碎片管理和光盘布局优化,在仅32MB内存的PlayStation 2上实现了《GTA III》的无缝开放世界,成为行业技术标杆。

<p><a href="https://lobste.rs/s/i6pafc/how_rockstar_fit_entire_city_into">Comments</a></p>
查看原文 导出为 Word 导出为 PDF
查看缓存全文

缓存时间: 2026/05/12 15:21

# TL;DR 《侠盗猎车手 III》凭借创新的流式加载技术,将一座大型城市塞进 PlayStation 2 仅 32 MB 的内存中,通过实时加载和卸载资源、细节层次(LOD)控制、内存碎片管理以及光盘布局优化,实现了无缝的开放世界体验。 ## 背景:32 MB 与一座城市的矛盾 PlayStation 2(PS2)拥有容量达 4.7 GB 的 DVD 光碟,足以存放整个游戏——所有模型、贴图、音效和广播电台。但 DVD 读取速度缓慢(约 5~6 MB/s),无法实时加载资源;而系统内存(RAM)速度极快(3.2 GB/s),却只有 32 MB——还不到光碟容量的 1%。 传统做法是将当前区域的所有数据加载到内存,离开时清空并加载下一区域,期间展示加载画面。但《GTA III》的世界是开放、无接缝的,玩家可以自由探索由数千个独特模型(约 77 MB)和贴图(约 45 MB)构成的自由城(Liberty City),总计约 130 MB,远超内存预算。 ## 解决方案:流式加载 游戏的技术主管 Adam Fowler 提出了一种更激进的方法:将自由城划分为上千个小区域。在玩家周围设置一个不可见的方形范围,只加载该范围覆盖区域所需的模型和贴图;当玩家移动时,持续加载新进入的区域,同时卸载离开的区域。 由于新加载的模型总是远离玩家,即使从 DVD 读取稍慢,也不会造成明显的停顿。这项技术被称为 **流式加载**(streaming)。 通过修改《GTA III》的源代码并重新编译,可以直观地看到这个机制:城市随着玩家移动,不断在内存中加载和卸载小块资源——世界在眼前秘密构建,又在身后悄然消失。 > **核心思想**:不把整座城市塞进内存,而是构建一个跟随玩家的“移动窗口”,只显示足以维持幻觉的部分。 ## 细节层次(LOD)与弹入控制 单纯的矩形加载会导致可怕的“弹入”(pop-in)现象——建筑在玩家面前凭空出现。解决方案是: - 对于远处的区域,只加载较大的结构(建筑、桥梁、船只等),使用**简化、低多边形、低分辨率贴图**的替身。 - 当玩家靠近时,真正的模型和贴图才被流式加载进来,并优雅地淡出覆盖掉低多边形副本。 - 这个系统称为 **LOD**(Level of Detail,细节层次)。 甚至其他岛屿(波特兰、斯汤顿、海岸之谷)各自拥有低多边形版本,作为自由城其他部分的替身悬浮在地平线上。例如,斯汤顿岛有两个不同的远景模型——取决于你从波特兰还是海岸之谷眺望,避免渲染不需要的背面,节省三角形数量。 ## 内存管理:挤出每一字节 32 MB 的 RAM 还需要存放动画、行人 AI、物理计算、玩家车辆位置等。实际上,只有一小部分可用于流式加载。以同引擎的《圣安地列斯》为例,`stream.ini` 文件显示仅约 **13.5 MB** 用于城市流式加载。 ### 载具池限制 游戏约有 60 种独特载具,总模型+贴图约 10 MB。但只要同时在内存中保留 8 种载具类型的模型。当生成一辆新车时,要么复用已有的 8 种之一,要么踢掉一辆旧车腾出空间。这个池子必须包含当前驾驶的车辆、之前开过的车、附近停放的车辆,以及常见的出租车、警车、直升机、军用卡车等。这也是为何玩家常常看到相同车辆反复出现,以及当你找到一辆稀有车后,似乎满城都是那辆车——因为它占据了八个槽位之一,被生成的概率大大增加。 ### 内存碎片化 持续加载和卸载小资源会在内存中留下难以合并的碎片,可能导致游戏崩溃。Adam Fowler 编写了特制的内存管理器,能够: - 合并和移动内存块以避免碎片化。 - 主动释放内存——删除摄像机背后的物体或远处天际线上的大建筑。 - 确保大量资源文件**大小完全相同**:超过 500 个文件恰为 2 KB,416 个恰为 4 KB。这样资源在加载和卸载时可以无缝互相替换,填充空隙,避免碎片化。 测试方法:将角色绑在沿波特兰飞驰的火车上,让游戏在五台 PS2 开发机上运行一整晚。最初五分钟内全部崩溃,经过数日调试,逐步撑过半小时、一小时,最终成功运行整夜——意味着整晚都在循环加载和卸载模型。 ## 光盘寻道优化 DVD 是为连续读取(如电影)设计的,数据以连续螺旋轨迹存储。若需跳转到光盘另一部分(寻道),激光头需要移动,耗费时间。《GTA III》不断要求 DVD 读取器寻道不同位置。为加快速度,Rockstar 必须从物理上优化资源在光盘上的布局: - 将来自城市同一地区的资源集中堆放,减少激光头远距离移动。 - DVD 读取器代码维护一个待加载队列,优先处理离当前读取位置最近的资源,而非按队列顺序。 - 尝试在光盘上复制资源——例如在光盘不同位置放置多份相同模型(树木、路灯),比不断寻道回单一位置更高效。这项技术至今仍在使用,如 Insomniac 的《蜘蛛侠》在蓝光光盘上存放了成百上千个相同的邮箱模型。 ## 风险与验证 持续寻道对 DVD 光驱是否安全?制作人 Leslie Benzies 在纪录片中表示:“流式加载是有风险的。机器里的光驱能否持续移动 24 小时而不熔化?” 事实上,PS2 光驱并未熔化——Vermeij 认为索尼在发售前已批准该设计。游戏最终成功推出,并为整个开放世界类型树立了技术标杆。 --- Source: [How Rockstar fit an entire city into PlayStation 2 memory](https://www.youtube.com/watch?v=cIbCxbrBCys)

相似文章

25+ years of pathfinding problems with C++

Lobsters Hottest

《帝国时代》工程总监深入剖析了系列游戏 25 年来寻路系统的技术债,指出遗留代码、动态地图机制及 SIMD 指令集取代 x87 扩展精度导致的浮点误差是单位“穿墙”等经典 Bug 的根源。

@AYi_AInotes: 卧槽,有大神直接用Claude Code,复刻出一整套完整游戏开发工作室。 GitHub 1.8万stars,免费开源,项目名叫Claude Code Game Studios, 48个AI智能体1:1还原线下工作室全岗位,从创意总监到关…

X AI KOLs Timeline

卧槽,有大神直接用Claude Code,复刻出一整套完整游戏开发工作室。 GitHub 1.8万stars,免费开源,项目名叫Claude Code Game Studios, 48个AI智能体1:1还原线下工作室全岗位,从创意总监到关卡设计师全覆盖。 36条斜杠指令一键启动全流程,适配Godot Unity Unreal三大游戏引擎。 自带自动化校验钩子、分路径编码规则、28套行业标准文档模板,架构拉满。 所有AI只做梳理方案不擅自操作,决策权全程握在自己手里。 克隆仓库一键启动,MIT开源可商用,凭空拥有一支专业游戏开发团队。 老规矩GitHub地址评论区自取!