开发者生态
morning
2004 RuneScape 将多人 RPG 融入 56k 拨号
2026-09-01
1 阅读
约6分钟阅读
fagnerbrack
字号:
2004 年,我在 56k 调制解调器上玩了太多 RuneScape,当妈妈拿起电话时,调制解调器就死机了。一个 3D 世界,服务器上最多有几千名玩家,屏幕上同时显示数十个玩家 - 在浏览器中,每秒 5 KB。它起作用了。让我们按照一个步骤来看看如何操作。当我还是个孩子的时候,我太专注于采摘亚麻和杀死妖精,而没有去思考这是如何运作的。然而,答案是持续的、近乎痴迷的不浪费字节的练习。因此,让我们单击我们所在位置以北的一个图块,并跟踪从该单击到服务器、到另一个玩家的屏幕穿过线路的每个字节。中央喷泉,Varrock Square Methodology # 这篇文章中的详细信息来自反编译的 2004 RuneScape 2 客户端。片段是反编译的粗略翻译,在一些地方进行了整理以提高可读性,但逻辑完好无损。各个版本的核心原则并不相同,但其中大多数原则从 RuneScape Classic (2001) 一直延续到现在的 RuneScape 3,当然还有 Old School RuneScape。如果您在 2000 年代初期玩过 RuneScape 并且仍然拥有那个时代的硬盘,请查看 RuneScape 存档项目。他们在编录历史性的 RuneScape 版本方面做了出色的工作,否则这些版本就会随着时间的流逝而消失,每一项贡献都很有价值。约束 # 让我们看看 Jagex 当时遇到的一些约束。带宽。 56k 调制解调器以每秒 56 kbps 的下行速度同步,上行速度更低,减去任何协议开销和线路噪声。称之为下降 5 KB/s,上升则少得多。到 2000 年,英国家庭已经可以使用宽带,但直到 2000 年代末,大多数英国家庭才拥有宽带连接,因此很多玩家都使用拨号上网。 2004 年,浏览器中的 Java 小程序。Java 小程序在安全沙箱中运行,这意味着没有原始的本机套接字,也没有 UDP。每个字节都通过单个 TCP 连接按顺序传输并具有每个段的开销。 600 毫秒的服务器周期。 RuneScape 游戏服务器以大约 600 毫秒的离散周期(或滴答)推进。每个周期,对于每个玩家,服务器都必须计算出玩家现在可以看到的所有内容,并在下一个周期之前将其发送。密码层,简要说明 # 登录握手完成后,在发送任何游戏数据包之前,会设置一个小型加密层。这不是为了节省字节;而是为了节省字节。它是堆栈中唯一的加密(除了登录握手中的一些 RSA 加密之外),它在这里是因为它保护的操作码正是后面每个部分所依赖的东西。每个数据包都以“操作码”字节开头:一个小整数,说明这是什么类型的数据包。该操作码(并且仅该操作码)使用称为 ISAAC 的流密码进行加密。有两种流在起作用 - 一种用于从客户端到服务器的流量,另一种用于相反方向的流量。双方都需要两个流:客户端对即将发送的内容进行加密并解密刚刚到达的内容,服务器在镜像中执行相同的操作(每个连接的玩家)。两个流都是从共享的四整数密钥播种的。客户端自己生成其中两个整数;另外两个来自服务器,作为握手的一部分。然后,服务器到客户端的流使用相同的种子,每个单词添加 50 个种子 - 足以防止两个方向共享密钥流: this.outboundCipher = new ISAAC(seed); for (int 索引 = 0; 索引 < 4; 索引++) { 种子[索引] += 50; this.inboundCipher = new ISAAC(seed);出去时加密一行: public void putOpcode(int opcode) { this.putByte(opcode + this.outboundCipher.value());在进来的路上,镜像:this.currentOpcode = (this.currentOpcode - this.inboundCipher.value()) & 0xFF;所以数据包主体没有加密,只有操作码。正如我们稍后将看到的,操作码告诉您如何读取数据包的其余部分,以及一个数据包在哪里结束,下一个数据包开始。如果没有它,主体只是一堵字节墙,因此对一个字节进行加密是针对第三方数据包解析器的最便宜的防御措施。发送步行请求 # 我们将看看当您单击向北一平方的图块时会发生什么,以及如何将其传输到服务器。在任何网络发生之前,客户端使用本地冲突图运行广度优先搜索,以构建从您所在位置到您单击位置的路径(在本例中是简单搜索),然后写入数据包以供服务器读取。寻路是标准的,所以我不会在这里详细介绍。数据包的第一部分是操作码,后面是包含数据包主体长度的单个字节。正如您将看到的,数据包中包含的字节数取决于路径的大小,因此这个“长度”字节允许服务器知道读取多远。并非所有数据包都具有此长度字节,只有包含某些可变大小主体的数据包才具有此长度字节。起始位置占用 4 个字节(两个短),每个后续航路点增量占用 2 个字节,并且有一个
这篇文章对您有帮助吗?
订阅66必读
每日精选科技资讯,直达你的邮箱