Documentation
¶
Overview ¶
Package rollback 提供 GGPO 风格的回滚重演算(rollback netcode)编排原语, 解决"客户端预测 + 服务器权威"架构下的延迟消除问题。
解决的问题:FPS/格斗/MOBA 类实时游戏中,玩家按下方向键时客户端不等待服务器 确认就立即移动(预测),当服务器随后下发的权威状态与本地预测不一致时,需要 "回滚到过去某帧 → 用权威状态覆盖 → 重放所有中间帧的输入"来无感纠正偏差。 这就是回滚重演算(rollback & resimulate)。
核心机制:
- Simulator[S, I]:业务需实现此接口——给定当前状态 S 和一帧的输入 I,返回新状态。
- Session[S, I]:本包的核心,管理预测帧、快照保存、服务器确认、回滚+重放。
- 本包只做编排(何时存快照、何时回滚、如何重放),不管网络传输(那是 gameloop/ ws/quic 的事)、不管确定性(那是 fixedpoint 的事)、不管渲染平滑(那是客户端的事)。
与相邻原语的关系:
- snapbuf 是"固定深度环形快照缓冲",rollback 内部使用它存历史快照;
- inputclock 用于帧映射与 RTT 估算,rollback 按需组合;
- gameloop 驱动 tick,rollback 在 OnTick 内调用;
- fixedpoint 保证 Simulate 的确定性——"相同 S + I → 相同 S'"。
并发安全:Session 不加锁(单一游戏循环线程内调用)。 零值不可用:用 NewSession 构造。
Index ¶
- type Option
- type Session
- func (s *Session[S, I]) Advance(predicted []I) (frame uint64, state S)
- func (s *Session[S, I]) Confirm(frame uint64, serverState S, confirmedInputs []I) (rolled bool, resimN int, state S)
- func (s *Session[S, I]) ConfirmedFrame() uint64
- func (s *Session[S, I]) Frame() uint64
- func (s *Session[S, I]) PredictionGap() int
- func (s *Session[S, I]) SnapshotAt(frame uint64) (S, bool)
- func (s *Session[S, I]) State() S
- func (s *Session[S, I]) Stats() Stats
- type Simulator
- type SimulatorFunc
- type Stats
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type Option ¶
type Option func(*config)
Option 配置 Session。
func WithMaxRollback ¶
WithMaxRollback 设置最大允许回滚帧数(默认 8)。超出则放弃回滚,直接跳到 服务器状态(会有跳帧感,但优于长时间卡顿)。
type Session ¶
type Session[S, I any] struct { // contains filtered or unexported fields }
Session 管理一个预测+回滚会话。S 是世界状态类型,I 是单帧输入类型。 非并发安全(由单个游戏循环驱动)。
func NewSession ¶
NewSession 创建回滚会话。initial 是初始世界状态,sim 是帧推进器。
func (*Session[S, I]) Confirm ¶
func (s *Session[S, I]) Confirm(frame uint64, serverState S, confirmedInputs []I) (rolled bool, resimN int, state S)
Confirm 接收服务器权威确认:frame 是服务器确认的帧号,serverState 是权威状态, confirmedInputs 是该帧的权威输入(用于替换本地预测输入后重放)。
返回值:
- rolled: 是否发生了回滚
- resimN: 重演算的帧数(0 表示预测正确或被强制跳帧)
- state: 纠正后的当前状态
func (*Session[S, I]) ConfirmedFrame ¶
ConfirmedFrame 返回最后确认帧号。
func (*Session[S, I]) PredictionGap ¶
PredictionGap 返回预测领先服务器确认的帧数。
func (*Session[S, I]) SnapshotAt ¶
SnapshotAt 返回指定帧的快照(如果仍在缓冲中)。
type Simulator ¶
Simulator 是业务的帧推进器:给定当前世界状态 S 和一帧输入切片 I,返回下一帧状态。 此函数必须是确定性的(相同 S + I → 相同返回值),否则回滚后会再次不同步。
type SimulatorFunc ¶
SimulatorFunc 把普通函数适配为 Simulator。
func (SimulatorFunc[S, I]) Simulate ¶
func (f SimulatorFunc[S, I]) Simulate(state S, frame uint64, inputs []I) S