减小 protobuf 消息大小的最佳做法?

Best practices to reduce size for protobuf messages?

我正在使用 protobuf-net 消息从 c# 客户端发送 positional/rotational 数据(vector3,四元数)到 c++ 服务器。

一开始我尝试了

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

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

层次结构变得越来越大,protobuff 消息的开销也随之增加。我可以将消息压缩成一条消息,但不确定它的可管理性如何。

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

可能值得考虑是否可以 re-structure 树来利用 "packed arrays" - 例如,如果您要发送 200 Transform(所以:600 Vector3 和 1800 int32), 通过

repeated Transform data = 1;

您可以通过发送一个 lot 来简化

repeated int32 data = 1 [packed = true];

即 1800 长。在 protobuf-net 术语中,这可以处理为:

[ProtoMember(1, IsPacked = true)]
public int[] Data {get;set;}

这避免了:

  • 1800 个字段 headers 用于整数
  • Transform 个实例的
  • 200 个字段 headers
  • 200 length-prefixes Transform 个实例
  • 600 个字段 header 用于 Vector3 个实例
  • 600 length-prefixes Vector3 个实例

而不是只使用一个字段 header 和一个 length-prefix

但是,它需要不同的处理。您将不得不手动将 9 个连续值的每个块视为一个转换。