跳到正文
钢铁浪潮
全部文章

专用服务器:钢铁浪潮的多人游戏是如何运作的

·作者:Rene Wang·阅读约 3 分钟

为什么由服务器掌握模拟、什么是迷雾过滤快照,以及一行命令的安装器在 Linux 主机上做了什么。

钢铁浪潮 0.6 加入了多人游戏,而它采用的形态对独立浏览器 RTS 来说有点不寻常:没有玩家主机。每场对局都运行在一台专用服务器上,由它模拟世界和 AI,浏览器只是发送指令并绘制被告知内容的客户端。这篇文章讲的是为什么这样做,以及它在实践中意味着什么。

帧同步不在选项之内

经典的 RTS 网络模型是确定性帧同步:每个玩家运行相同的模拟,只有指令在网络上传输,因为模拟逐位相同,所有人保持同步。它优雅而廉价,但要求每台机器上的每一次浮点运算、每一个迭代顺序、每一次随机数抽取都完全一致。钢铁浪潮的模拟在单个进程中是带种子且可重复的,但它从未被写成能在不同浏览器间满足这种契约,而改造它意味着围绕一个与玩法无关的约束重写移动和战斗代码。

另一种选择是权威模式:一个进程掌握真相,其他人渲染副本。它消耗带宽,也需要一台服务器,但它同时免费提供了帧同步很难做到的东西,比如中途加入、断线重连,以及无法通过篡改本地状态作弊的客户端。

迷雾由网络层强制执行

服务器以固定 30 Hz 推进模拟,与单人游戏相同。每隔三个 tick,它为每个已连接的阵营构建一份快照。这份快照不是整个世界,而是该阵营被允许看到的那部分世界。你迷雾中的敌方单位根本不在消息里,你没有声呐覆盖的潜艇也不在消息里,一个修改了渲染器想画出一切的客户端会发现没有任何额外的东西可画。快照由 WebSocket 传输层压缩,客户端在最近两个位置之间插值,所以 10 Hz 的数据流看起来像 60 Hz 的游戏。

指令反方向经过单人游戏使用的同一道验证边界:每条命令都会检查归属、目标可见性、地图边界和已知定义 ID,并按连接限速。8 MB 的上限覆盖上传的存档。

存档、检查点与回归

房主可以从任何本地存档开始对局,这意味着大厅必须接受一个文件而不只是地图名称。上传的存档保留其地图、实体、阵营、战役状态和随机数生成器状态;服务器在触碰它们之前会验证尺寸、阵营数和实体数。运行后,服务器在对局开始时以及每六十秒游戏时间写入一次原子检查点。掉线的浏览器为每台服务器保存一个不透明的重连令牌,回来时重新认领自己的阵营。

Linux 主机上的一条命令

如果托管很难,这一切都没有用,所以服务器是一个由 Bun 编译的单一可执行文件,同时提供完整的网页客户端。在一台 systemd Linux 机器上:

curl -fsSL https://rts.rene.wang/setup.sh | sudo sh

安装器会创建一个无特权的服务,生成主机密钥和加入码,并打印房主链接和玩家链接。加上 --domain play.example.com,它会获取一张 Let's Encrypt 证书,这比听起来更重要:没有 TLS,https 页面上的浏览器无法打开明文 WebSocket,所以玩家必须被跳转到服务器的裸 IP,并失去原站点下保存的存档。服务器指南有详细说明,包括如何在 443 端口或反向代理后运行。

尚未实现的部分

没有匹配、没有中继、没有观战模式、没有聊天。目前的全部产品就是给一群朋友用的直连 IP 托管,而设计在其余部分逐步搭建的同时保持这条路径畅通。