文档管理中心
指南联机对战C# SDK使用指导消息通信帧同步

帧同步

您可以通过调用联机对战服务相关接口,实现帧同步,保证端与端之间的稳定通信。同时,联机对战服务还提供了两种补帧方式,可用于补帧相关使用场景。

前提条件

玩家已进入房间。

帧同步

玩家进入房间后,可通过如下相关接口,实现帧同步。

  1. 玩家通过创建或加入房间操作进入游戏房间后,获得room实例,且实现Room.OnStartSyncFrameRoom.OnStopSyncFrameRoom.OnRecvFrame委托,分别用于接收帧同步开始通知回调、帧同步停止通知回调和帧同步信息回调。
    收起
    自动换行
    深色代码主题
    复制
    1. // 添加帧同步开始通知回调
    2. Global.Room.OnStartSyncFrame = () => { // 通过Global类的Room属性获取Room对象,绑定监听事件
    3. // 接收帧同步开始通知,处理游戏逻辑
    4. };
    5. // 添加帧同步停止通知回调
    6. Global.Room.OnStopSyncFrame = () => { // 通过Global类的Room获取Room对象,绑定监听事件
    7. // 接收帧同步停止通知,处理游戏逻辑
    8. };
    9. // 添加接收帧同步信息回调
    10. Global.Room.OnRecvFrame = (msg) => { // 通过Global类的Room属性获取Room对象,绑定监听事件
    11. // 处理帧数据msg
    12. };
  2. 通过调用Room.StartFrameSync方式开启帧同步,开启帧同步后,房间内其他玩家将从Room.OnStartSyncFrame委托中收到帧同步开始通知,联机对战服务将会按固定帧率向该房间内所有玩家广播帧数据信息。
    收起
    自动换行
    深色代码主题
    复制
    1. // 开启帧同步
    2. Room room = Global.Room; // 通过Global类的Room属性获取Room对象
    3. Room.StartFrameSync(response =>
    4. {
    5. // 开始帧同步
    6. });
  3. 帧同步开始后,房间内玩家可通过Room.SendFrame方法向联机对战服务端发送游戏操作数据,房间内其他玩家将从Room.OnRecvFrame委托中收到房间内操作玩家的帧数据信息。
    收起
    自动换行
    深色代码主题
    复制
    1. // 发送帧数据,房间内玩家可通过该方法向联机对战服务端发送帧数据
    2. string[] frameDatas = new string[] { frameData };
    3. Room room = Global.Room; // 通过Global类的Room属性获取Room对象
    4. Room.SendFrame(frameDatas, response => {});
  4. 通过调用Room.StopFrameSync方法停止帧同步,其他玩家将从Room.OnStopSyncFrame委托中收到帧同步停止通知。
    收起
    自动换行
    深色代码主题
    复制
    1. // 向联机对战后端发送停止帧同步请求
    2. Room room = Global.Room; // 通过Global类的Room属性获取Room对象
    3. Room.StopFrameSync(response => {
    4. // 停止帧同步;
    5. });

补帧方式

在游戏过程中,可通过“自动补帧”或“手动补帧”两种方式进行补帧,用于掉帧后补帧或游戏回放等特定场景。

自动补帧

SDK提供了自动补帧的能力,如果您在AGC控制台已开启了自动补帧(默认开启)功能,当玩家发生掉线状况后重新加入到原游戏中,SDK识别到帧数不连续,客户端会自动发起请求进行补帧。

手动补帧

除SDK自动补帧方式外,还可以通过手动方式进行补帧。

注意

如果您使用手动补帧方式,需前往AGC控制台确认自动补帧功能已关闭,否则可能会导致补帧功能异常。

  1. 如需手动补帧,可通过调用Room.SendRequestFrame方法实现。
    收起
    自动换行
    深色代码主题
    复制
    1. int beginFrameId = 123; // 起始帧Id
    2. int size = 100; // 请求帧数
    3. Global.Room.SendRequestFrame(beginFrameId, size, response => {});
  2. 手动补帧后,玩家可通过Room.OnRecvFrame监听接收帧信息。
    收起
    自动换行
    深色代码主题
    复制
    1. // 添加接收帧同步信息回调
    2. Global.Room.OnRecvFrame = (msg) => { // 通过Global类的Room属性获取Room对象,绑定监听事件
    3. // 处理帧数据msg
    4. };
  3. 当手动补帧失败时,玩家可通过Room.OnRequestFrameError监听接收到补帧失败的结果。
    收起
    自动换行
    深色代码主题
    复制
    1. // 添加接收帧同步信息回调
    2. Global.Room.OnRequestFrameError= response => this.OnRequestFrameError(response);
    3. private void OnRequestFrameError(BaseResponse response){
    4. // 处理帧请求补帧失败结果
    5. }
在 指南 中进行搜索
请输入您想要搜索的关键词