90年代中期可以说是PC史上最让人眼花缭乱的变革期。3D加速卡的出现、从纯文本DOS向华丽的Windows 95过渡、以及互联网的兴起,几乎全部同时发生。这种快速变化的环境给游戏开发者带来了巨大挑战他们必须决定是为DOS、Windows 95,还是两者都支持来编写游戏。
在一篇极为详尽的中,Fabien Sanglard解释了原始《Quake》如何获得TCP/IP支持,并且几乎是唯一一款使用同一可执行文件同时原生支持两种操作系统的游戏。
当时的许多游戏,如《Fallout》《Grand Theft Auto》以及《Mortal Kombat 3》,都会为DOS与Windows 95各自提供独立的可执行文件。然而,id Software想让《Quake》使用几乎相同的可执行文件(以及代码库),并且希望游戏具备TCP/IP——当时的互联网通信协议——支持。那时,远程多人游戏是一个全新的概念;真正的多人对战往往局限在家庭或办公室局域网中。
要同时满足这两个要求,对《Quake》而言并非易事。游戏开发时,DOS已经相当老旧,需要大量hack才能利用当时硬件的全部能力,尤其是突破640 KB内存的限制。
为了解决DOS的局限,游戏开始使用DPMI(DOS Protected Mode Interface)扩展器,例如Watcom的DOS/4GW或CWSDPMI。这些扩展器提供了统一的内存接口、多任务等功能。扩展器在技术上相当于一个微内核,可以看作是DOS的替代品。通常,游戏会随附一个目标DPMI服务器,并把自己当作唯一客户端。
在《Quake》开发期间,id想把当时专用于《Doom》的专有Watcom编译器换成开源的djgpp工具链,以便更轻松地进行跨平台开发。实际上,《Quake》甚至有过DEC Alpha版,若有人还记得的话。不同以往的做法是,id要求djgpp的工程师确保其DPMI客户端能够兼容Windows 95自带的DPMI服务器,同时兼容CWSDPMI。
问题在于,虽然DPMI已成为标准,但其规范直到90年代后期才最终确定。这意味着在实际使用中,客户端软件往往只能绑定到特定的服务器。但djgpp团队交付了成果,微软高级内核工程师Raymond Chen直言不讳地说
“程序在运行于外来扩展器下仍能基本正常工作,这要么是完全令人惊讶,要么是显而易见,这取决于你的立场。”
《Quake》内部已经写入了原生的TCP/IP支持,但因为是跨平台的,它仍需与Windows 95的Winsock TCP/IP层交互。当时,游戏内的服务器/对战列表也是全新概念,于是id通过联手Mpath Interactive,把其Mplayer匹配系统集成进《Quake》,一次性解决了两个难题。
Mplayer软件由两部分组成一个名为 “Gizmo” 的游戏浏览器,会自动检测已安装的兼容Mplayer的游戏并列出对应的游戏房间;以及一个名为 “Chunnel” 的组件,实际负责与Windows的TCP/IP栈通信。
为实现跨平台兼容,《Quake》还随附了Mpath的genvxd.dll。这是一个虚拟设备驱动程序,能够把DOS网络功能(本身使用现已标准化的BSD套接字调用)转换为Windows 95的Winsock。装上它后,一切就大功告成,《Quake》可以在DOS或Windows环境下无缝运行,无需分别的安装程序或可执行文件。
想了解更细致的技术细节,请访问Fabien Sanglard的深度解析。如果这篇文字让你重新燃起了对原版游戏的兴趣,赶紧去下载重制版来玩玩吧。
