protobuf定义低带宽的移动消息
(金庆的专栏 2017.8)
用protobuf定义协议时,可利用protobuf的编码方式将移动消息压缩到尽量小。
service Battle {
// 移动变化量。将广播给其他玩家,包括自己。
// 移动受步长限制。自动转向移动方向。
rpc Move(Movement) returns (rpc.EmptyMsg);
// 转向最终面向。将广播给其他玩家,包括自己。
rpc TurnTo(Rotation) returns (rpc.EmptyMsg);
}
// 位置,移动和角度都用整数向量表示,单位为分米.
// 使用整数占用的带宽比浮点数少。
// U3d使用以米为单位的浮点数,需要转化。
message Position {
optional sint32 x = 1;
optional sint32 y = 2;
}
// 移动时发送移动量。不是发送绝对位置,使用更小的数字,占用更少带宽。
message Movement {
optional sint32 x = 1;
optional sint32 y = 2;
}
// 角度向量在满足精度的前提下,应该尽量使用绝对值小的数据表示,占用更少带宽.
message Rotation {
optional sint32 x = 1;
optional sint32 y = 2;
}
// 位置和面向。用于初始化对象。
message PosAndRot {
optional Position position = 1;
optional Rotation rotation = 2;
}
说明
* 名字短点。因为RPC消息中需带服务全名和方法名,所以package, service, method名字要短点
* 坐标用整数表示。浮点数会固定占用4个字节,而接近0值的整数值只占用不到一个字节。
* 使用移动变化量。地图可能很大,绝对坐标值较大会占用变多字节,而移动量总是接近0
* 角度使用向量更容易处理。也可使用整数的角度值(0-360)表示,但处理麻烦。
* 移动隐含了转向。所以转向消息不多,不必太在意大小。
* sint编码压缩最大。要求地图坐标应该都在0附近,正负各半。
* 单位选择不要太细,分米到厘米都可以。