绝大多数多人游戏的第一笔开销不是开发,而是机房:租服务器、付带宽、养运维。玩家越多,账单越厚,一旦停服,花再多钱买回来的游戏也会变成一块废铁。《苍穹对决》的选择是——一台服务器都不部署。听起来像天方夜谭:没有服务器,十个人怎么在同一片天空下狗斗?这一篇就从这个最反直觉的问题讲起。
一、服务器的账单:传统网游的第一道门槛
先弄清楚传统架构为什么离不开服务器。经典网游是客户端—服务器模型:每个玩家把操作发给服务器,服务器计算世界状态,再广播给所有人。它承担三件事——转发(消息中继)、仲裁(谁打中谁、谁先谁后)、容灾(断线重连、版本校验)。这三件事都要 7×24 小时在线的机器来扛,于是就有了机房、带宽和运维成本。
而对一款免费网页游戏来说,这笔固定成本尤其致命:没有买断收入,玩家量又天然波动,服务器要么常年空转烧钱,要么高峰期挤爆。更隐蔽的是连锁成本——为了防攻击要上高防,为了容灾要做多机房备份,为了合规要处理数据存储,每一项都是钱和人。《苍穹对决》的解法不是"优化成本",而是直接质疑前提——这三件事,真的必须在机房里做吗?
二、WebRTC:浏览器原生的直连管道
答案藏在每台浏览器里。WebRTC 最广为人知的用途是网页视频通话,但它还提供一个更适合游戏的界面:DataChannel 数据通道——一条在两个浏览器之间建立的点对点连接,可以双向收发任意二进制数据,延迟特性与 UDP 相当。它由浏览器内核直接实现,不需要安装任何插件,也不需要任何一台中间服务器参与数据传输。
《苍穹对决》的所有联机流量都走这条管道:你的浏览器直达朋友的浏览器。子弹、爆炸、坠机、比分——每一比特数据都只在你们两台设备之间流动。数据的传输路径,就是你们之间的那条网线,绕不开,也省不掉——这恰恰是低延迟的来源。
值得强调的是 DataChannel 与 WebSocket 的本质区别。WebSocket 看起来也是浏览器里的"长连接",但它的每一帧都要先发到服务器,再由服务器转发——它只是把"轮询"变成了"长连",数据路径没有任何变化。DataChannel 则是真正的设备到设备:连接一旦建立,两台浏览器之间就存在一条旁路,不经过任何中间节点。对节奏以毫秒计的空战游戏来说,这个差别就是"跟手"与"漂移"的差别。
三、没有信令服务器,怎么"认识"对方?
WebRTC 建立连接前有个先有鸡还是先有蛋的问题:双方必须先交换一份"名片"——SDP 描述,写着自己支持什么编码、监听哪个地址——之后才能开始直连。交换名片这一步通常由信令服务器转发,而《苍穹对决》连这个也不用。
它的做法是把名片压缩成一段邀请码文本:房主点"创建房间"生成邀请码,复制后用微信、QQ 任意渠道发给好友;好友粘贴邀请码,生成一段应答码回传;房主粘贴应答码——两来两回,连接即成。整个"信令"过程由玩家的聊天工具代劳,零成本、零延迟敏感(名片只交换一次),换来的是彻底的零依赖:没有任何中心节点会宕机、会跑路、会收费。
这当然牺牲了一点便利性:不能像商业游戏那样一键匹配陌生人。但对一款"开黑"为核心的游戏来说,先把邀请码发到好友群里的动作,本来就存在。而且手动交换还有一个常被低估的好处:交换方式完全由玩家自己决定——面对面扫码、发微信群、写进邮件都行,信令通道天然冗余,永远不会"信令服务器维护中,无法连接"。
四、为什么连 STUN 和 TURN 都不要
熟悉 P2P 的读者会问:家里路由器都在 NAT 后面,两个内网地址怎么直连?业界的标准答案是 STUN(帮忙探测自己在公网的映射地址)和 TURN(直连失败时当中继兜底)。《苍穹对决》把 ICE 候选配置留空——不用 STUN,也不用 TURN。
这意味着浏览器只拿本机地址去尝试握手。在局域网联机和大多数家用网络环境下,握手都能直接成功;少数严格 NAT(如对称型 NAT)后会连不上。这是一次清醒的取舍:牺牲一小部分复杂网络环境的兼容性,换回数据 100% 点对点——没有打洞服务器记录你的地址,没有中继服务器能看到你的流量,也没有任何一个"必要环节"成为故障点。
从工程角度看,这个取舍还有一层含义:整个联机层的复杂度大幅下降。不需要维护 STUN 服务的可用性,不需要处理 TURN 中继的鉴权与流量计费,也不需要在打洞失败、中继成功、中继失败之间做状态机。一个空数组 iceServers: [],换来的是一条只需要测试"通与不通"两种状态的链路。
五、双通道设计:快慢分明
每条连接上开两条 DataChannel,各司其职,这是整个联机层最重要的设计决策:
- state 通道:不可靠、不排序,20Hz 高频推送位置与姿态快照。丢了就丢了,绝不重传——因为下一帧马上就到,最新状态永远比完整历史更有价值。飞机位置、姿态、血量这些"越新越好"的数据全走这里。
- event 通道:可靠、有序,承载开火、死亡、回合切换、比分变更这类"一次都不能丢、顺序不能乱"的关键事件。慢一点没关系,但必须到达,且到达顺序与发送顺序严格一致。
如果只有一条可靠通道,一次丢包重传会卡住后面所有状态更新,画面瞬间"倒放";如果只有一条不可靠通道,"你死了"这个消息可能永远在路上。实时性交给前者,正确性交给后者——这是网络同步最经典的分治思路,也是后两篇文章一切机制的地基。
六、零服务器的意外之喜:隐私与安全
最后说一个容易被忽略的收益。隐私:没有服务器,就没有任何第三方存储你的 IP、设备信息和行为数据,对局结束后什么都不留。公平:传统网游里,服务器被 DDoS 就全员掉线;《苍穹对决》的对局没有"打掉就全掉"的靶子——想断掉一局 1v1,你得同时断掉两台玩家设备之间的直连。寿命:只要浏览器还支持 WebRTC,这个游戏的联机功能就永远可用,不存在"停服"这个概念。