聊聊多人游戏的核心架构——服务端权威,客户端只做展示

04/1295 浏览开发心得

一、什么是"服务端权威"?

一句话概括:游戏世界的真实状态只存在于服务端,客户端只是一个"播放器"。
打个比方:
1.服务端 = 导演 + 剧本,决定剧情怎么走
2.客户端 = 电视机,负责把画面播给观众看
客户端采集玩家的输入(按了什么键、点了哪里),打包发给服务端。服务端计算结果,再把最新的世界状态广播回来。客户端拿到数据后,只做一件事——渲染
┌──────────┐    输入指令     ┌──────────┐
│  客户端   │ ─────────────→ │  服务端   │
│ (展示层)  │ ←───────────── │ (逻辑层)  │
└──────────┘    世界状态     └──────────┘
horizontal linehorizontal line

二、为什么不能信任客户端?

因为客户端在玩家手里。任何运行在玩家设备上的代码,原则上都可以被修改。
如果让客户端决定逻辑,会发生什么?
| 客户端说 | 实际情况 | 后果 |
|---------|---------|------|
| "我命中了对方" | 子弹根本没飞到 | 外挂秒杀 |
| "我的金币+99999" | 没有消费行为 | 经济系统崩溃 |
| "我移动到了终点" | 刚刚才起步 | 瞬移作弊 |
| "我没有受到伤害" | 明明站在火里 | 无敌挂 |
核心原则:客户端发送的一切数据都是"请求",不是"事实"。
horizontal linehorizontal line

三、服务端权威的职责划分

服务端做什么(权威层)

✅所有游戏逻辑的计算
✅碰撞检测与物理模拟
✅伤害计算、经济系统、背包操作
✅状态同步(广播给所有客户端)
✅输入合法性校验(反作弊的第一道防线)
✅随机数生成(抽卡、掉落等)

客户端做什么(展示层)

✅采集玩家输入,发送给服务端
✅接收服务端状态,渲染画面
✅播放动画、音效、粒子特效
✅客户端预测(提升手感,但服务端有最终裁决权)
✅插值/外推(平滑显示其他玩家的移动)

一张表看清边界

| 功能 | 客户端 | 服务端 |
|------|--------|--------|
| 玩家输入采集 | 执行 | - |
| 移动计算 | 预测(可选) | 权威计算 |
| 碰撞检测 | 仅表现层 | 权威判定 |
| 伤害/治疗 | 显示数字 | 权威计算 |
| 背包/金币 | 显示 UI | 权威管理 |
| 开箱/抽卡 | 播放动画 | 权威随机 |
| 排行榜 | 显示数据 | 权威排序 |
horizontal linehorizontal line

四、常见的误区

误区 1:"服务端权威 = 延迟高、手感差"

不是的。 客户端预测 + 服务端校正可以做到几乎无感延迟。
时间线:
T0: 玩家按下前进键
T0: 客户端立即执行预测移动(玩家看到角色动了)
T0: 同时把输入发送给服务端
T1: 服务端收到输入,计算权威结果
T2: 客户端收到服务端结果
    ├─ 结果一致 → 什么都不用做
    └─ 结果不一致 → 平滑修正到服务端位置
玩家在 T0 就看到了反馈,体验和单机没有区别。只有在作弊或极端网络波动时才会出现修正。

误区 2:"所有数据都要服务端算,太慢了"

纯表现类逻辑不需要服务端参与
1.粒子特效的飘动方向——客户端自己算
2.UI 动画、过场动画——客户端自己播
3.摄像机抖动——客户端自己做
4.脚步声、环境音——客户端自己放
原则:不影响游戏公平性的,客户端自己处理。

误区 3:"我的游戏很小,不需要服务端权威"

取决于你的游戏是否涉及:
| 场景 | 是否需要服务端权威 |
|------|:------------------:|
| 纯单机,无排行榜 | 不需要 |
| 有排行榜/成就 | 需要 |
| 有 PvP 对战 | 必须 |
| 有内购/经济系统 | 必须 |
| 有社交/交易 | 必须 |
只要涉及玩家之间的比较或利益,就需要服务端权威。
horizontal linehorizontal line

五、实践建议

1. 输入上行,状态下行

```
客户端 → 服务端:只发"意图"
    "我想往前走"
    "我想攻击"
    "我想使用物品 #3"
服务端 → 客户端:只发"结果"
    "你的坐标是 (10, 0, 25)"
    "怪物 A 扣了 50 血"
    "物品 #3 已使用,效果:回血 100"
```

2. 永远不要相信客户端发来的"结果"

```
❌ 客户端说:"我对 Boss 造成了 99999 伤害"
✅ 客户端说:"我按下了攻击键",服务端自己算伤害
❌ 客户端说:"我的金币现在是 50000"
✅ 客户端说:"我想购买物品 X",服务端自己扣钱
❌ 客户端说:"我现在站在 (100, 0, 200)"
✅ 客户端说:"我这帧按了 W 键",服务端自己算位置
```

3. 服务端做校验,客户端做预测

移动校验:速度是否超过上限?是否穿墙?
攻击校验:目标是否在射程内?冷却是否结束?
购买校验:余额是否足够?物品是否存在?

4. 带宽优化

不需要每帧发送全部状态:
增量同步:只发变化的部分
兴趣区域:只发玩家附近的信息
降频同步:远处的实体用更低的频率更新
horizontal linehorizontal line

六、总结

  客户端是不可信的展示终端,服务端是唯一的事实来源。
  客户端负责"看起来怎样",服务端负责"实际是怎样"。
  两者配合得好,玩家既感受不到延迟,作弊者也无处下手。
horizontal linehorizontal line
希望对正在做多人游戏的同学有帮助,欢迎讨论。
6
5
1