第5章 对象复制(Object Replication)

复制系统要把对象创建、状态更新、RPC和销毁绑定到统一网络身份与权威顺序。

直觉:先找唯一事实

复制系统要把对象创建、状态更新、RPC和销毁绑定到统一网络身份与权威顺序。 真正的难点不是让一次理想样本跑通,而是让消息身份、世界版本、状态权威和时间预算在丢包、乱序、重复与断线后仍可解释。先预测:如果只保存最终成功画面,本页最可能隐藏哪一种分歧?

权威目录定位

本页依据 Addison-Wesley / InformIT 官方书目与官方目录样章锁定范围。英文标题用于一对一追踪,中文正文为独立教学重构;现代平台差异、安全强化和可观察性补充会明确披露:

  • The State of the World
  • Replicating an Object
  • Naïve World State Replication
  • Changes in World State
  • RPCs as Serialized Objects
  • Custom Solutions
  • Summary
  • Review Questions
  • Additional Readings

本页逐项覆盖9个公开目录条目,并纳入同一套正常、边界、失败与恢复验收。

核心概念与所有权

、、、、 。每个概念都要回答:谁创建输入,谁拥有可变状态,哪个序号或版本拒绝旧结果,断线后由谁恢复。

#概念工程含义
1世界状态在某个模拟时刻决定所有网络对象可观察行为的数据集合。
2网络ID跨端点稳定标识同一复制对象的协议级身份。
3对象复制把对象创建、字段变化和销毁传播到远端代理的机制。
4RPC把远端应执行的命令及参数编码成消息并受权威规则约束的调用。
5脏状态自上次确认或发送以来发生变化、需要重新编码的字段集合。

机制拆解

1. 朴素全量复制建立正确性基线

先周期性发送完整世界,能暴露对象身份、创建顺序和销毁语义;它虽不经济,却是比较增量方案的基线。若没有可重放的全量快照,就难以证明增量丢失后能否重新收敛。

先预测:若省略这一层,哪一个序号、所有权或时间预算会最先失真?

2. 状态与事件不能混为一谈

位置、生命值等状态可被较新快照覆盖,开火、拾取等RPC通常需要恰好一次或可判定重复的语义。为两者使用同一“可靠”开关会造成过期状态阻塞或事件重复;应按可替代性和时效性分别建通道。

先预测:若省略这一层,哪一个序号、所有权或时间预算会最先失真?

3. 自定义复制仍需统一不变量

针对不同对象选择字段掩码、优先级和频率能节省带宽,但网络ID、所有权和版本检查不能各自实现。创建前更新、销毁后RPC和ID复用是三个关键乱序样本,必须在注册表边界拒绝。

先预测:若省略这一层,哪一个序号、所有权或时间预算会最先失真?

六阶段证据链

可操作链条是:分配网络ID → 发送创建描述 → 建立远端代理 → 传播脏字段 → 排序RPC → 确认销毁与回收。正常样本证明能力,边界样本证明预算,失败样本证明拒绝,恢复样本证明状态与资源重新收敛。

最小实现骨架

以下代码是独立复现实验骨架,不复制原书代码。序号比较必须处理回绕,生产实现还需补齐平台错误、认证、容量与资源清理。

struct NetworkEvidence {
  std::uint32_t sequence;
  std::uint32_t worldVersion;
  std::uint64_t objectId;
  double sentAtMs;
  double appliedAtMs;
};
 
bool accepts(const NetworkEvidence& next, const NetworkEvidence& current) {
  return next.objectId == current.objectId &&
         next.worldVersion >= current.worldVersion;
}

证据记录把目录、时序与状态摘要放在一起:

book: Multiplayer Game Programming
page: mgp-05-object-replication
official_entries: 9
sample: normal | boundary | failure | recovery
protocol_version: fixed
network_seed: fixed
state_owner: explicit
first_divergence: null

故障脚本一次只改变一个变量:

baseline -> inject(delay | jitter | loss | duplicate | disconnect)
observe -> stop_at_first_divergence
recover -> replay_same_version_seed_and_input
assert -> one_authority && converged_state && no_orphan_resource

常见误区与故障注入

验收矩阵

样本网络与输入变化预期状态通过条件
正常合法版本、顺序、身份与容量六阶段完成权威摘要与对象身份一致
边界临界延迟、抖动、回绕或满载达到预算不越界队列有界且无永久饥饿
失败丢包、重复、畸形、断线或节点失效首偏离点停止明确拒绝、回滚或接管
恢复清除故障后重放同一输入收敛到正常轨迹无双权威、幽灵对象和资源泄漏

本页签发不变量是:网络ID在生命周期内唯一;创建先于更新、销毁终止后续消息;状态与事件使用符合语义的交付策略。 单次演示、平均延迟或最终截图不能替代序号、版本、首偏离点和恢复证据。

练习

小结

  • 世界状态:在某个模拟时刻决定所有网络对象可观察行为的数据集合。
  • 网络ID:跨端点稳定标识同一复制对象的协议级身份。
  • 对象复制:把对象创建、字段变化和销毁传播到远端代理的机制。
  • RPC:把远端应执行的命令及参数编码成消息并受权威规则约束的调用。
  • 脏状态:自上次确认或发送以来发生变化、需要重新编码的字段集合。
  • 六阶段机制链已经映射到正常、边界、失败和恢复证据。
  • 官方目录逐项追踪,现代补充不会冒充原书正式分节。

术语表

来源与改编边界

讨论

评论区加载中…