1996年8月,卡马克正在为互联网游玩重写Quake。v1.01的网络代码假设链路延迟低于200毫秒,并以20fps的tick循环运行服务器,而大多数玩家使用的是300毫秒以上的拨号连接;旧有的可靠流代码用他的话说是“一团糟”——因此他将其移除并重新开始。

围绕最差链路重新设计网络代码:每收到一个数据包就立即发送响应,并让客户端预测自身移动,直到服务器发送权威修正。

他使不可靠数据包成为基本原语,将服务器从游戏风格的tick循环改为文件服务器风格的循环——只向前移动发送玩家并在4毫秒内响应,增加带宽估算使拥塞的调制解调器链路降低更新速率而不是缓冲,并让客户端模拟自己的移动直至服务器修正。在新引擎周围,他勾勒了一个主服务器,包括持久账户和全局击杀排名,通过约10美元的名称注册获得资金。

服务器响应时间从超过50毫秒降至4毫秒以下,在200毫秒以上的连接上,卡马克报告称玩家移动感觉像玩单人游戏一样。2019年转载后,该方案在Hacker News获得395分和162条评论;其中描述的“本地预测、由服务器修正”模式成为在线动作游戏的标准结构。

1996年8月,John Carmack复制了Quake代码库,开始了一个他称为QuakeWorld的项目:互联网游玩作为独立产品,与注册游戏和谐共存的单独客户端和服务器可执行文件。他的动机直白——v1.01的网络代码是为低于200毫秒的连接设计的,但当时世界上约99%的人通过slip或ppp调制解调器链路访问互联网,延迟达300毫秒或更差,且常经过拥挤的ISP。

他的第一步是架构性的:他废弃了可靠流网络代码——他曾在其上改装不可靠旁路直至混乱——并以不可靠数据报作为基础原语重建。服务器不再是20fps的游戏循环,而是文件服务器风格的循环:每收到一个数据包就立即处理——仅将那个玩家向前移动并在4毫秒内响应,而不是超过50毫秒。带宽估算使堵塞的拨号链路就停止发送,而不是让路由器将延迟缓冲成多秒停顿。

最大的变化是客户端移动模拟:客户端猜测上述移动的结果直到服务器权威答复到达,这样即使通过200毫秒以上的链路移动也感觉像本地单人游戏。在它周围,卡马克勾勒了一个主服务器、持久账户、全局击杀排名和约10美元的名称注册,同时指出诚实的局限:其他玩家和射弹仍然滞后,因此你必须预判射击。他描述的预测本地模式成为在线射击游戏隐藏延迟的标准模板。

客户端预测对玩家自身移动隐藏了往返延迟,因此300毫秒链接感觉即时而非漂浮。

逐包事件循环将服务器响应时间从约50毫秒降至4毫秒以下,因为它从不等待整个世界tick。

带宽估算为调制解调器链路提供了优雅的故障模式——减少每秒更新次数而非缓冲堆积和多秒停顿。

持久账户、全球排名列表和约10美元的注册费将互联网功能变成收入来源和购买而非盗版的理由。

当网络成为瓶颈时,围绕最坏情况重新设计:将模拟推向边缘,每收到请求即响应,并让慢速链路降低更新速率而不是缓冲造成延迟。

该.plan文件称QuakeWorld的工作将在Quake 2之路上回滚到单人游戏中,同时标记未解决的问题:时间不再均匀推进,射弹看起来来自玩家过去的位置而非当前位置。测试预计在1996年8月底开始。记录在john-carmack-plan-archive中,这封信在2019年5月被Hacker News转载后仍获得395分和162条评论——其中阐明的客户端预测和事件驱动服务器思想在几十年后仍是网络动作游戏的参考模型。

从这里,追溯依据

参考来源

  1. John Carmack .plan, 2 August 1996 (QuakeWorld latency and business model) john-carmack-plan-archive (ESWAT) · raw.githubusercontent.com ·
  2. John Carmack on QuakeWorld latency and business model (1996) - Hacker News discussion Hacker News · news.ycombinator.com ·