近期,科技媒体 NeoWin 发表了一篇引人注目的报道,指出在 Windows 11 24H2 系统上运行经典游戏《侠盗猎车手:圣安地列斯》时,游戏中的 Skimmer 水上飞机竟然完全消失,玩家无法在游戏世界中找到它的踪迹。这一奇怪现象迅速在游戏玩家社区中引发了热烈讨论。
随着话题的持续发酵,SilentPatch 项目的开发者 Silent 注意到了这一异常。SilentPatch 是一个专注于修复老游戏漏洞并提升其在现代系统上的兼容性的非官方项目。Silent 最初推测问题可能与玩家安装的 MOD 或特定的系统配置有关,但经过一系列测试后,他排除了这些可能性。
Silent 在纯净版的游戏环境下进行测试,发现只要在 Windows 11 24H2 系统上运行,《侠盗猎车手:圣安地列斯》中的 Skimmer 就会神秘消失。更令人惊讶的是,当 Silent 尝试通过游戏内命令强制生成 Skimmer 时,游戏角色 CJ 会被瞬间弹射到天空中,距离高达 1.087 千万亿光年,游戏画面随即失控或直接崩溃。
Silent 深入分析了游戏的代码,发现问题的根源在于 Skimmer 的物理边界框计算错误。具体来说,Skimmer 的 Z 值被设置成了一个极不合理的数字(-4.30747210e+33),导致游戏错误地判断了飞机的位置。Silent 进一步追踪发现,问题的源头在于游戏配置文件 vehicles.ide 中 Skimmer 的定义不完整,缺少了轮子尺寸参数。
原来,在《侠盗猎车手:罪恶都市》时期,Skimmer 被归类为船只,因此无需这些参数。但在《圣安地列斯》中,Skimmer 被改为了飞机,而游戏开发商 Rockstar 并未更新相应的配置文件。当游戏代码读取数据时,相关变量未被初始化,其值依赖于内存堆栈中的随机数据。在过去的 20 年里,在 Windows 10 等版本中,Skimmer 前一个车辆 Topfun 的轮子尺寸值(0.7)恰好残留在内存中,使得 Skimmer 能够勉强正常运行。
然而,在 Windows 11 24H2 更新中,内存堆栈的使用方式发生了变化(涉及 LeaveCriticalSection 函数),覆盖了之前的残留值,导致 Skimmer 的物理计算彻底失控。Silent 强调,这并非 Windows 11 的问题,而是《侠盗猎车手:圣安地列斯》代码本身的漏洞,长期以来一直依赖内存布局的“侥幸”运行。
Silent 表示,他将在下一版 SilentPatch 中修复这一问题。对于希望立即解决此问题的玩家,Silent 提供了一个临时解决方案:手动编辑游戏目录下的 datavehicles.ide 文件,找到 Skimmer 的相关行并添加轮子尺寸参数(0.7),即可恢复飞机的正常显示和使用。