Published on

帧同步技术简介与开发实践

Authors
  • avatar
    Name
    hpoenixf
    Twitter

帧同步简介

帧同步是一种保持玩家一致性的技术,常用于对战联机游戏。王者荣耀就采用了帧同步技术。其核心原理是:

  • 玩家进行操作时,将操作上传到服务器。
  • 服务器定时将接收到的操作广播给所有客户端。
  • 每个客户端收到相同的数据,并运行相同的逻辑,因此结果保持一致。

帧同步的优点(相比状态同步)

  1. 高一致性:所有客户端运行相同逻辑,结果一致。
  2. 低流量消耗:只需要同步操作数据,不需要同步状态。
  3. 简化服务器逻辑:服务器无需参与具体的游戏逻辑计算。
  4. 便于反作弊:服务器可对操作数据进行校验。

SDK 开发特点

本次开发的帧同步 SDK 具有以下特点:

  • 多平台支持:兼容微信小程序、QQ 小程序、Web 和 App 端。
  • 使用 UDP 技术:延迟低、弱网表现更好。

兼容多平台的实现

通用实现思路

  1. 对外接口保持一致:无论平台,统一使用相同的 API 和数据结构。
  2. 复用平台能力:根据平台提供的通信方式进行封装。

各平台的实现细节

  1. UDP 实现

    • 优点:无连接、延迟低、多播、弱网表现更好。
    • 挑战:UDP 的无连接特性导致传输不可靠。解决方案:
      • 上传时采用 三倍冗余
      • 数据结构中包含帧 ID,定时校验帧 ID 的连续性。
      • 若发现丢帧,向服务器请求补帧。
  2. 微信小程序

    • 原生支持 UDP,封装平台能力后即可使用。
    • 遇到的坑:封装过程中存在大量兼容性问题,需逐步调试解决。
  3. Web 端

    • Web 暂不支持 UDP,只能降级为 TCP 实现。
    • 使用 WebSocket 替代 UDP,保证传输的实时性。
  4. QQ 小程序

    • 原生支持 UDP,但需付费使用。
    • 降级为 TCP 实现。
  5. App 端

    • App 使用 UDP 与后台通信,同时通过 WebSocket 与 Web 端通信,曲线实现帧同步。

为什么不用 JSBridge?

  • JSBridge 使用字符串传输,效率低下。
  • 帧同步对传输量和实时性要求高,因此选用 WebSocket 方案。

反作弊机制

  1. 多人模式

    • 采用多数人决策法。
    • 多个玩家的操作结果不一致时,以多数玩家的结果为准。
  2. PK 模式

    • 定时校验关键环节,防止作弊。
  3. 服务器校验

    • 将操作数据转发给服务器运行游戏逻辑并校验。

开发过程中踩过的坑

1. 难以排查问题

  • 问题:帧同步的初始化过程复杂,每个环节(如链接、登录、验证)都可能出错,难以快速定位问题。
  • 解决方法
    • 为每个步骤输出日志并编号。
    • 当出错时上传编号列表,结合日志反向定位问题。

2. 错误处理不清晰

  • 问题:错误种类繁多(服务器、SDK、自定义逻辑),游戏方无法明确处理方式。
  • 解决方法
    • 分类错误等级:
      1. 致命错误:导致游戏无法继续。
      2. 需要注意的错误:可能影响游戏体验。
      3. 无关紧要的错误:可忽略。
    • 主动告知错误类型和严重级别,便于游戏方处理。

3. 事件机制不完善

  • 问题:断开连接时 SDK 默默重连,游戏方无法得知。
  • 解决方法
    • 增加事件机制:
      • 断开连接事件。
      • 重新连接事件。
      • 游戏开始、结束事件。
    • 教训:即使认为对用户无影响的操作,也需要主动告知用户,保持透明。

4. 容易掉线

  • 问题:网络不稳定时玩家容易掉线。
  • 解决方法
    • 定时发送心跳包。
    • 计算 Ping 值,及时监控网络状况。

5. 玩家表现不同步

  • 问题:浮点数运算导致客户端计算结果不同步。
  • 解决方法
    • 避免使用本地浮点数计算。
    • 定时同步状态。
    • 使用帧数据驱动展示。

开发总结

帧同步技术可以显著提升多人联机游戏的一致性和用户体验。在开发过程中,需要注意以下几点:

  1. 兼容性设计

    • 在多平台支持下,尽量统一接口和数据结构。
    • 根据平台特性灵活调整通信方式。
  2. 反作弊机制

    • 合理设计校验规则,确保游戏公平性。
  3. 日志与事件机制

    • 清晰的日志与事件机制有助于快速排查问题。
    • 主动向用户(游戏方)告知运行状态和可能的问题。
  4. 网络优化

    • 使用 UDP 优化延迟,同时设计机制弥补其不可靠性。
    • 心跳包与 Ping 值计算可提高连接的稳定性。

帧同步的开发是一项充满挑战但充满意义的工作,通过不断完善,我们可以为用户提供更流畅、更一致的游戏体验。