减小原生气泡消息大小的最佳做法?

时间:2018-07-16 09:26:18

标签: protocol-buffers protobuf-net

我正在使用protobuf-net消息从c#中的客户端向c ++中的服务器发送位置/旋转数据(vector3,四元数)。

一开始,我尝试了

形式的分层方法
Message Vector3
{ 
int32 x = 1;
int32 y = 2;
int32 z = 3;
}

Message Transform
{
Vector3 trackedPos1 = 1;
Vector3 trackedPos2 = 2;
Vector3 trackedPos3 = 3;
}

,层次结构变得越来越大,随之而来的是probbuff消息的开销。我可以将消息拼合为一条消息,但不确定消息将变得易于管理。

所以有人知道如何以低开销解决此问题吗?

1 个答案:

答案 0 :(得分:1)

您是否可以重新构造树以利用“打包数组”可能值得思考-例如,如果您要发送200 Transform(因此:600 Vector3和1800 { {1}}),通过

int32

您只需发送一个即可简化很多

repeated Transform data = 1;
长度为1800的

。用protobuf-net术语可以这样处理:

repeated int32 data = 1 [packed = true];

这可以避免:

  • 1800个整数的字段标题
  • [ProtoMember(1, IsPacked = true)] public int[] Data {get;set;} 实例的200个字段标题
  • Transform个实例的200个长度前缀
  • Transform实例的600个字段标题
  • Vector3个实例的600个前缀

而不是仅使用单个字段标题和单个长度前缀

但是,将需要不同的处理。您必须手动将9个连续值的每个块都视为Transform。