中EN
概念页

多人网络游戏模型

Multiplayer Networking Models

多人游戏并不是共享同一份物理现实,而是每位玩家各自看到的近似。历史上主要两条路:对等锁步 (Peer-to-Peer Lockstep)(RTS 仍常用)与权威客户端/服务器 (Authoritative Client/Server)(动作/FPS 主流);后者再叠加客户端预测、插值与延迟补偿,把延迟藏进体验里。

核心幻觉

从外面看,多个玩家似乎同处一个虚拟世界;从程序员视角,这是精心设计的错觉——每人基于本地时刻与视角看到的是近似状态。(What Every Programmer Needs To Know About Game Networking)

对等锁步

早期网游常做成全连接网格,各方交换命令而非完整状态,从同一初始状态推进相同回合(Age of Empires 等 RTS 的经典路径)。优点是带宽跟单位数量脱钩。代价是:

  1. 确定性极难保证,一点路径差就会整盘不同步;
  2. 必须等齐所有人的命令,延迟等于最慢玩家;
  3. 中途加入困难(要抓取可复现的中途检查点)。

(What Every Programmer Needs To Know About Game Networking;实现细节见 确定性锁步同步)

客户端/服务器

Doom 的锁步在调制解调器互联网上几乎不可玩。Quake 改为 C/S:游戏真正只在服务器上存在,客户端像哑终端,发输入、收附近状态并插值。体验取决于本机到服务器的链路,而不是全场最慢的人;还可中途加入,人均带宽更低。(What Every Programmer Needs To Know About Game Networking)

Source 引擎沿用同一骨架:专用服务器权威模拟与规则;客户端发用户命令、收世界快照;服务器做压缩与滞后补偿,客户端做预测与插值。(Source Multiplayer Networking)

flowchart LR
  subgraph clients ["客户端"]
    C1["客户端 A"]
    C2["客户端 B"]
  end
  S["权威服务器"]
  C1 -->|"输入 / usercmd"| S
  C2 -->|"输入 / usercmd"| S
  S -->|"快照 / 状态"| C1
  S -->|"快照 / 状态"| C2

上图:客户端彼此不直接通信;服务器是唯一权威。

纯 C/S 的延迟问题

若客户端完全等待服务器回包再动,RTT 会直接变成操作手感(Quake 原版在高延迟 PPP 上体感极差)。现代 FPS 用 客户端预测与纠正重放 消除自己动作的延迟,用 快照插值 平滑别人,用 延迟补偿 让命中检测对齐「你看见的那个时刻」。(What Every Programmer Needs To Know About Game Networking;Latency Compensating Methods in Client/Server In-game Protocol Design and Optimization)

选型取舍

模型带宽确定性延迟特征典型体裁
P2P 锁步极低(只传输入)必须比特级一致等于最慢对端RTS、部分格斗
权威 C/S + 快照随对象数上升不需要全场确定取决于到服务器的 RTTFPS、动作、大部分网游
C/S + 预测/补间/补偿同上,可再压本地与服务器运动代码尽量一致本地操作近零感延迟现代射击

反作弊要求下,不能让客户端自行申报「我现在的位置 / 我爆了谁的头」作为权威;服务器必须是「The Man」。(What Every Programmer Needs To Know About Game Networking;Latency Compensating Methods in Client/Server In-game Protocol Design and Optimization)

与 UE5 的对应

UE 的服务器权威复制与 RPC、专用服务器、CMC/Mover 预测纠正,都是本页 C/S 模型在引擎里的落地:见 网络复制与 RPC、专用服务器、角色移动组件与 Mover。

  1. What Every Programmer Needs To Know About Game Networking
  2. gafferongames.com/post/what_every_programmer_needs_to_know_about_game_networking
  3. Source Multiplayer Networking
  4. Latency Compensating Methods in Client/Server In-game Protocol Design and Optimization
  5. Yahn W. Bernier, Latency Compensating Methods… (Valve, 2001)

相关页面

游戏开发确定性锁步同步Deterministic Lockstep锁步不同步物体状态,只同步驱动模拟的输入;各方从相同初态用相同固定步长推进。带宽与对象数量无关,但要求比特级确定性,且每人延迟受最慢输入到达时间约束,通常适合约 2–4 人。游戏开发快照插值Snapshot Interpolation发送端按固定频率拍下世界(或相关子集)的快照,接收端不跑权威模拟,而是把渲染时刻拨回一小段,在缓冲里的两份快照之间插值,用额外延迟换平滑,并扛住抖动与偶发丢包。Source 的实体插值与 clinterp 是同一思想的产品化。游戏开发客户端预测与纠正重放Client-Side Prediction & Reconciliation本地客户端立刻用与服务器相同的运动(及可选武器)代码根据输入推进自己的角色,消除操作往返延迟;服务器仍是权威。权威纠正到达时已是「过去」,客户端丢弃过期缓冲、回绕到纠正状态再重放未确认输入,得到与服务器一致的「现在」。游戏开发延迟补偿Lag Compensation服务器在执行玩家开火等用户命令前,把其他玩家(及必要状态)回拨到「该命令在客户端生成时」所对应的世界时刻——扣除包延迟与客户端视图插值——再做命中判定,然后恢复。这样玩家可以对着自己屏幕上看到的目标直接开火,而不必凭感觉提前量;代价是可能出现「拐角后仍被击中」等时间悖论。游戏开发UDP 与游戏协议设计UDP & Game Protocol Design动作游戏的时间关键数据(输入、位姿、物理)只关心最新状态。TCP 的可靠有序流会在丢包时把头阻塞住;正确做法是游戏协议只走 UDP,自己做虚拟连接、按需可靠性与拥塞退避,并按数据类型选择「冗余重发」还是「直接丢弃旧包」。游戏开发 · UE5网络复制与 RPCNetwork Replication & RPCUE 采用服务器权威 (Server-Authoritative) 的客户端-服务器模型:游戏真正在服务器上进行,服务器把状态复制 (Replication) 给客户端,客户端通过远程过程调用 (Remote Procedure Call, RPC) 向服务器请求操作。开发者需要显式声明哪些 Actor、属性、函数要走网络,并借助所有权、网络角色、相关性、优先级控制“发给谁、发多少”。UE 5.8 提供通用复制系统、Replication Graph 和实验性的 Iris 三套复制系统。游戏开发 · UE5专用服务器Dedicated ServerUE 多人游戏采用客户端-服务器模型。监听服务器 (listen server) 由某个玩家的客户端兼任服务器;专用服务器 (dedicated server) 无头运行,不渲染画面,也没有本地玩家。专用服务器体积更小、房主没有不公平优势、能专注于玩法逻辑,适合大规模或竞技游戏。构建专用服务器需要源码版引擎和支持客户端-服务器的 C++ 项目,并要有 <ProjectServer.Target.cs。游戏开发 · UE5角色移动组件与 MoverCharacter Movement Component & Mover角色移动组件 (CMC) 用「客户端预测 + 服务器校验 + 纠正后重放」实现联网移动:自主代理先在本地移动并把操作存起来,用 ServerMove RPC 发给服务器重演,位置不符时服务器用 ClientAdjustPosition 纠正,客户端再按保存的操作重放;模拟代理只应用复制下来的移动并做平滑。实验性插件 Mover 计划接替 CMC,改用共享时间线、回滚与重模拟的模型,并且更模块化。

被这些页面引用5 篇

输入关键词开始搜索

滚轮或双指缩放 · 拖动平移 · 双击放大 / 还原