设计本地同步
选择适合玩法的模型
| 玩法 | 同步方式 | 需要明确的规则 |
|---|---|---|
| 回合/棋类 | 可靠事件、顺序号和确认 | 谁接受动作,重复/越序如何处理 |
| 实时动作 | 权威快照、本地预测和远端插值 | 谁裁定状态,怎样纠正预测 |
| 确定性格斗 | 输入历史、短期预测和完整回滚 | 固定步、确定性、状态保存与重演预算 |
P2P 房主权威不等于服务端防作弊。只做移动预测就说明移动预测,不把它称为完整世界回滚。
分开模拟、渲染和发送
逻辑按固定时间步推进,渲染插值不改变命中和计时;发送按带宽预算独立调度。先测实际输入延迟与长帧,再调整频率,不用收到的远端 tick 跳变冒充本地模拟次数。
持续按住的状态与按下/松开边沿分开采集。为消息加入局代次、输入序号和确认水位;连续确认只覆盖真正收到的连续输入。短按和松开不能只发一次就丢弃。量化时本地和发送使用同一值,避免两端从源头不同。
可靠事件与可替换状态
开始、结算、规则变更等事件需要确认与去重。位置快照等可替换状态只保留最新值;可靠 FIFO 不与快照一起覆盖。发送已接受不等于对方已处理。
输入历史用于重发和重演,未来动作队列用于玩法接受下一动作,二者分开。动作有效期和取消窗口由玩法定义,网络恢复不能把几秒前连点积压成接连出招。
断流与资源预算
输入预测、历史容量、接收队列与单帧重演都有上限。远端进度超过预算时暂停同步,提供恢复或结束出口,不持续扩大历史或阻塞主线程。迟到旧包不是有效进度,分别检查最新远端帧和确认水位。
本地检查
双端使用同一规则和种子,测试短按/长按/松开、双方不同绘制频率和慢端。注入延迟、乱序、重复与丢包,检查动作不丢、不积压、队列有界,恢复后确认帧一致。实测输入到画面、模拟频率、绘制长帧和带宽,不只看 FPS。
Godot 联机说明提供引擎传输与场景同步基础,游戏仍负责本页的规则与输入语义。