- Published on
帧同步技术简介与开发实践
- Authors
- Name
- hpoenixf
帧同步简介
帧同步是一种保持玩家一致性的技术,常用于对战联机游戏。王者荣耀就采用了帧同步技术。其核心原理是:
- 玩家进行操作时,将操作上传到服务器。
- 服务器定时将接收到的操作广播给所有客户端。
- 每个客户端收到相同的数据,并运行相同的逻辑,因此结果保持一致。
帧同步的优点(相比状态同步)
- 高一致性:所有客户端运行相同逻辑,结果一致。
- 低流量消耗:只需要同步操作数据,不需要同步状态。
- 简化服务器逻辑:服务器无需参与具体的游戏逻辑计算。
- 便于反作弊:服务器可对操作数据进行校验。
SDK 开发特点
本次开发的帧同步 SDK 具有以下特点:
- 多平台支持:兼容微信小程序、QQ 小程序、Web 和 App 端。
- 使用 UDP 技术:延迟低、弱网表现更好。
兼容多平台的实现
通用实现思路
- 对外接口保持一致:无论平台,统一使用相同的 API 和数据结构。
- 复用平台能力:根据平台提供的通信方式进行封装。
各平台的实现细节
UDP 实现:
- 优点:无连接、延迟低、多播、弱网表现更好。
- 挑战:UDP 的无连接特性导致传输不可靠。解决方案:
- 上传时采用 三倍冗余。
- 数据结构中包含帧 ID,定时校验帧 ID 的连续性。
- 若发现丢帧,向服务器请求补帧。
微信小程序:
- 原生支持 UDP,封装平台能力后即可使用。
- 遇到的坑:封装过程中存在大量兼容性问题,需逐步调试解决。
Web 端:
- Web 暂不支持 UDP,只能降级为 TCP 实现。
- 使用 WebSocket 替代 UDP,保证传输的实时性。
QQ 小程序:
- 原生支持 UDP,但需付费使用。
- 降级为 TCP 实现。
App 端:
- App 使用 UDP 与后台通信,同时通过 WebSocket 与 Web 端通信,曲线实现帧同步。
为什么不用 JSBridge?
- JSBridge 使用字符串传输,效率低下。
- 帧同步对传输量和实时性要求高,因此选用 WebSocket 方案。
反作弊机制
多人模式:
- 采用多数人决策法。
- 多个玩家的操作结果不一致时,以多数玩家的结果为准。
PK 模式:
- 定时校验关键环节,防止作弊。
服务器校验:
- 将操作数据转发给服务器运行游戏逻辑并校验。
开发过程中踩过的坑
1. 难以排查问题
- 问题:帧同步的初始化过程复杂,每个环节(如链接、登录、验证)都可能出错,难以快速定位问题。
- 解决方法:
- 为每个步骤输出日志并编号。
- 当出错时上传编号列表,结合日志反向定位问题。
2. 错误处理不清晰
- 问题:错误种类繁多(服务器、SDK、自定义逻辑),游戏方无法明确处理方式。
- 解决方法:
- 分类错误等级:
- 致命错误:导致游戏无法继续。
- 需要注意的错误:可能影响游戏体验。
- 无关紧要的错误:可忽略。
- 主动告知错误类型和严重级别,便于游戏方处理。
- 分类错误等级:
3. 事件机制不完善
- 问题:断开连接时 SDK 默默重连,游戏方无法得知。
- 解决方法:
- 增加事件机制:
- 断开连接事件。
- 重新连接事件。
- 游戏开始、结束事件。
- 教训:即使认为对用户无影响的操作,也需要主动告知用户,保持透明。
- 增加事件机制:
4. 容易掉线
- 问题:网络不稳定时玩家容易掉线。
- 解决方法:
- 定时发送心跳包。
- 计算 Ping 值,及时监控网络状况。
5. 玩家表现不同步
- 问题:浮点数运算导致客户端计算结果不同步。
- 解决方法:
- 避免使用本地浮点数计算。
- 定时同步状态。
- 使用帧数据驱动展示。
开发总结
帧同步技术可以显著提升多人联机游戏的一致性和用户体验。在开发过程中,需要注意以下几点:
兼容性设计:
- 在多平台支持下,尽量统一接口和数据结构。
- 根据平台特性灵活调整通信方式。
反作弊机制:
- 合理设计校验规则,确保游戏公平性。
日志与事件机制:
- 清晰的日志与事件机制有助于快速排查问题。
- 主动向用户(游戏方)告知运行状态和可能的问题。
网络优化:
- 使用 UDP 优化延迟,同时设计机制弥补其不可靠性。
- 心跳包与 Ping 值计算可提高连接的稳定性。
帧同步的开发是一项充满挑战但充满意义的工作,通过不断完善,我们可以为用户提供更流畅、更一致的游戏体验。