Skip to content

协议可简化 #1

@jinq0123

Description

@jinq0123

我定义的帧同步服务器协议如下,可以讨论下:

/* 客户端服务器之间仅需通过kcp收发消息,没有实现grpc *\
// 中继服提供的房间中继接口,用于向客户端提供服务。
service Relay {
    rpc EnterRoom (EnterReq) returns (EnterResp) {}

    // 玩家动作
    rpc Act (stream ActMsg) returns (ActResp) {}

    // 帧广播
    rpc Tick (TickReq) returns (stream TickMsg) {}
}

各消息定义如下:

message EnterReq {
    // 服务器可以从 player_token 找到对应的房间和玩家号.
    optional string player_token = 1;

    // 上个帧号,需要服务器发送之后的帧: last_tick+1, last_tick+2, ...
    // 用于断线重连。
    // 如果是从头开始,则 last_tick 为0, 开始帧为 1.
    optional uint32 last_tick = 2;
}

message EnterResp {
    optional bool ok = 1;
    optional string error = 2;
    optional uint32 player_id = 3;
    optional uint32 ifs = 4; // 帧时间间隔
    optional uint64 rand_seed = 5; // 随机种子
}

message ActMsg {
    // 客户端自定义格式,服务器不会解析.
    optional bytes action = 1;
}

message ActResp {
}

message TickReq {
}

// 帧消息。
// 中继服将记录所有帧消息,用于断线重连。
message TickMsg {
    optional uint32 tick = 1;  // 当前帧号:1,2,...
    repeated PlayerActions player_actions = 2;  // 所有玩家的动作

    // 单个玩家当前帧的所有输入动作。保持输入次序。
    message PlayerActions {
        optional uint32 player_id = 1;
        repeated bytes actions = 2;
    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions