protobuf定义低带宽的移动消息

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附近,正负各半。

* 单位选择不要太细,分米到厘米都可以。

相关文章

相关标签/搜索