2004 年 RuneScape 如何在 56k 拨号上网中运行
2004 RuneScape fit a multiplayer RPG into 56k dial-up

2004 年,我在 56k 调制解调器上沉迷于 RuneScape,只要妈妈拿起电话,游戏就会立刻断线。在那个浏览器中运行、每秒仅 5 千字节带宽的年代,RuneScape 却能在服务器容纳数千玩家,屏幕上同时显示数十人。这一切的实现,源于 Jagex 团队对每一个字节的极致吝啬。本文通过反编译 2004 年的 RuneScape 2 客户端,追踪一次点击移动指令从客户端到服务器的完整字节旅程,揭示其如何利用位打包、差分传输和固定长度协议,在 Java applet 的安全沙箱和 TCP 连接限制下,将庞大的多人 RPG 塞进狭窄的拨号通道。
答案在于一种持续的、近乎偏执的不浪费字节的练习。
HN 评论区
60- akersten
我希望作者能更深入地探讨反作弊机制及其演变过程。Jagex 早在 2005 年左右就开始基于鼠标移动启发式算法封禁机器人了。20 年过去了,这里首页上某个 JS 框架还在吹嘘同样的分析方法是某种革命性的新途径。我实在难以想象现代反作弊引擎究竟包含些什么,尤其是在大语言模型(LLM)能够可靠模拟人类玩家的时代。(其中一些模型甚至能写出相当技术性的博客文章,几乎能逃过检测 ;))
- saejox
Ultima Online 1997 年发布,只需要 28k 调制解调器。
我也认为那款游戏更复杂。
- OsrsNeedsf2P
这篇文章难道只是对 Lost City[0] 代码库的分析,却连 Lost City 的链接都没放?
- NDlurker
Sega Dreamcast 上的《梦幻之星在线》(Phantasy Star Online)在拨号上网环境下运行得相当不错。
- stux
> 在任何网络通信发生之前,客户端会使用本地碰撞图运行广度优先搜索,构建从你当前位置到点击位置的路径,然后生成数据包供服务器读取。[...] 数据包包含路径中第一个路点的绝对位置,随后是路径中每个路点相对于第一个路点的增量。
为什么客户端发送的是路点而不是仅仅发送目的地?直观来看,发送更少的数据似乎更好。是因为寻路计算太昂贵,所以你想避免在服务器端进行吗?我想只要验证或修正客户端路径的成本足够低,这套方案就能行得通吧?