减小 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 个连续值的每个块视为一个转换。
我正在使用 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 个连续值的每个块视为一个转换。