# 设计本地同步

## 选择适合玩法的模型

| 玩法 | 同步方式 | 需要明确的规则 |
| --- | --- | --- |
| 回合/棋类 | 可靠事件、顺序号和确认 | 谁接受动作，重复/越序如何处理 |
| 实时动作 | 权威快照、本地预测和远端插值 | 谁裁定状态，怎样纠正预测 |
| 确定性格斗 | 输入历史、短期预测和完整回滚 | 固定步、确定性、状态保存与重演预算 |

P2P 房主权威不等于服务端防作弊。只做移动预测就说明移动预测，不把它称为完整世界回滚。

## 分开模拟、渲染和发送

逻辑按固定时间步推进，渲染插值不改变命中和计时；发送按带宽预算独立调度。先测实际输入延迟与长帧，再调整频率，不用收到的远端 tick 跳变冒充本地模拟次数。

持续按住的状态与按下/松开边沿分开采集。为消息加入局代次、输入序号和确认水位；连续确认只覆盖真正收到的连续输入。短按和松开不能只发一次就丢弃。量化时本地和发送使用同一值，避免两端从源头不同。

## 可靠事件与可替换状态

开始、结算、规则变更等事件需要确认与去重。位置快照等可替换状态只保留最新值；可靠 FIFO 不与快照一起覆盖。发送已接受不等于对方已处理。

输入历史用于重发和重演，未来动作队列用于玩法接受下一动作，二者分开。动作有效期和取消窗口由玩法定义，网络恢复不能把几秒前连点积压成接连出招。

## 断流与资源预算

输入预测、历史容量、接收队列与单帧重演都有上限。远端进度超过预算时暂停同步，提供恢复或结束出口，不持续扩大历史或阻塞主线程。迟到旧包不是有效进度，分别检查最新远端帧和确认水位。

## 本地检查

双端使用同一规则和种子，测试短按/长按/松开、双方不同绘制频率和慢端。注入延迟、乱序、重复与丢包，检查动作不丢、不积压、队列有界，恢复后确认帧一致。实测输入到画面、模拟频率、绘制长帧和带宽，不只看 FPS。

[Godot 联机说明](https://docs.godotengine.org/en/stable/tutorials/networking/high_level_multiplayer.html)提供引擎传输与场景同步基础，游戏仍负责本页的规则与输入语义。
