- Client A
- Server
- Client B
- ...
- ...
- ...
- RULE
- move
- adjust
- client A move
- at the same time
-
How
- 模拟包未到达时下一个周期的状态
- 根据通信往时间估算需要模拟的时间
- 包到达后, 通过加快或者减慢动作, 或者使动作连贯来修正误差
- 使用自适应的传输delay来划分周期.
-
Lockstep
-
其中一个客户端作为服务器
- 避免广播消息让通信量暴增
- 服务器负责决断整个游戏状态.
-
方式
-
事件锁定
- 选择事件
-
事件包
- 时间点
- 时间点对应的状态
-
Transport Protocol
- TCP
- 速度慢于UDP
- 可靠的保障
- UDP
- 很快的速度
- 自己保证正确性
- 丢包
- 时间顺序
-
时间同步
- ball move to P at time T
- SNTP/NTP
- 高阶消除
- 时间请求包加上本地时间 (sentTime)
- 服务器收到后加上自己时间(currentTime), 返回原包
- 计算 delta = (currentTime - sentTime) / 2
- 第一个收到的包用来立即同步时间
- 重复1到3步
- 存储每个delta
- 大于序列中值1.5倍的数值抛弃, 剩下的取算术平均值
-
帧锁定
- waiting for the frame update information
- 更新速度只取决于最慢的那台客户端
-
Age of Empires: 对等用户架构. 自适应通信往返时间.
- turns were separated in AoE from actual rendering frames
-
details
-
周期间插值
- 划分周期
- 更小的周期得到更精确的动作, 但是通信量更大
- 隐藏延迟
-
主机迁移
- 当主机退出时如何迁移到另外一台机器
- AI接管
- 速度慢的机器发特定包, 告诉服务器需要调整速度
-
Out of sync
- 直接修改游戏状态, 而不是通过统一的接口
- 修改非己方Player数据
- 使用本机时钟, 而不是统一周期
- 游戏版本不同
- 引用对象的改变
-
testSuite
-
计算所需要的包大小
- 操作统计
- Objects统计
- 模拟延迟
-
Other protocol
- 对等用户
- c/s
-
hints
- 在编写单机的时候考虑到多人游戏
- 了解用户, 然后统计操作习惯以及感受用于优化
- 尽可能早的实际测量网络性能