我在 Proto3 中有一个消息结构,我希望能够发送具有相同类型定义的多个项目。请看以下示例
syntax = "proto3";
message Player {
uint32 id = 1;
uint32 x_pos = 2;
uint32 y_pos = 3;
PlayerColour colour = 4;
}
enum PlayerColour {
colour_unspecified = 0;
colour_green = 1;
colour_white = 2;
colour_gold = 3;
}
message AllPlayers {
Player player_1 = 1;
Player player_2 = 2;
Player player_3 = 3;
Player player_4 = 4;
}
如您所见,此结构预定义了单个消息中可以通信的玩家数量。我很好奇,有没有办法让实例数量可变?
即,如果只有一名玩家的数据发生变化,则发送的消息仅包含玩家参数的一个实例。或者,如果在给定时刻只有 2 名玩家在玩游戏,则不会浪费带宽发送未使用的数据包(空白的 player_3 和 player_4 实例)这将大大减少传输此数据所需的总带宽。
有什么建议吗?
是的。首先,请注意它已经是变量了;如果您没有为字段分配值
AllPlayers.player_2
,则无需发送任何内容- 对于该玩家来说,实际上是零字节。或者,您可以repeated Player players = 1;
根据需要使用和添加任意多或任意少的字段,使用.id
来解析接收方是哪个Player
玩家。单个字段和字段之间的带宽实际上没有区别repeated Player
- 直到您获得相当数量的单个Player
条目,这时成本会更高(字段数越大,发送字节数就越多;最多 15 个字段的字段标头占用 1 个字节)