三维弹球可以算是我的童年回忆之一。当时 Windows 自带的几个小游戏(纸牌,空当接龙,蜘蛛纸牌等),三维弹球是画面最酷炫的。
只是 XP 之后似乎就没有再见过三维弹球,我曾以为是盗版 Windows 打包时移除了这个功能,今天阅读了 Raymond Chen 的博客 The Old New Thing. 发现三维弹球已经被删除了,其中还有段有趣的历史
翻译
三维弹球小游戏自 Windows 95 开始被包含在操作系统里, Windows XP 是最后一个保留它
的 Windows 客户端版本。有人猜测这是因为某些法律方面的原因。
并非如此。
我在为 Windows XP 工作时,曾把几百万行级别的 Windows 代码从 32 位操作系统移植到
64 位操作系统上,以便我们的 Windows XP 64 位版本能够搭载运行这些代码。但有一个程
序却让我们陷入了困难,这个程序就是三维弹球。64 位版本的三维弹球有一个很讨厌的
bug:弹球会像个幽灵一样穿过所有物体。举个例子,当你开始游戏时,弹球会被送到弹射
版上,然后直接穿过弹射版掉了下去。这游戏就太短,没法玩了。
我们当中的两个人试图通过调试这个程序来找出究竟发生了什么。但这代码其实是在数年前
交给一个外包公司写的,而且 Microsoft 里没有一个人曾了解过这些代码是怎么工作的
(更别说现在仍然了解了)。此外,这些代码的绝大部分都完全没有任何注释。我们无法简
单的找出碰撞检测器代码为何不工作,见鬼,我们甚至找不到碰撞检测器代码位于哪里!
我们仍有几百万行的代码需要移植,因此花费时间来学习代码,尝试找出是哪一个不被人所
理解的浮点舍入错误导致了碰撞检测器失效,是不现实的。最后我们作出了行政决定,把三
维弹球从 Windows 产品中移除。
如果我说的这些能让你好受一些,其实我和你一样对删除三维弹球感到难过。我真的很喜欢
玩那个游戏。他也是我最引以为豪的 Windows XP 功能之一。
此外,还有 David Garage 对此的解释,David Garage 也曾为微软工作,把 32 bit 的游戏 port 到 64 bit 系统上。
TLDR
Raymond Chen 没有骗你,通过反向工程把一个 32bit 版本的三维弹球的 FPU 精度改为 64 位,就会出现 Raymond Chen 提到的“弹球穿越弹射板”的bug. 但他说的不完全对。
Windows XP 支持很多架构,比如 Intel 的安腾(IA64),以及 AMD64(我们现在的 x86_64)等等。微软在 Windows XP 64位操作系统的安装清单里移除了三维弹球。但是,安装光碟里面还有这些文件,甚至微软的工作人员曾在 AMD64 架构的 Windows XP 上的测试 build (代号 Longhorn)里面修复了三维弹球的 bug。
David Garage 则在他视频的评论区说,一个特性不可能某些架构有而另一些架构没有,当时三维弹球某个架构上有 bug 且无法修复,因此就决定把它移除了