protocol-buffers - 减少 protobuf 消息大小的最佳实践?

标签 protocol-buffers protobuf-net

我使用 protobuf-net 消息从 C# 中的客户端发送位置/旋转数据(向量 3、四元数)到 C++ 中的服务器。

一开始我尝试了一种分层方法

Message Vector3
{ 
int32 x = 1;
int32 y = 2;
int32 z = 3;
}

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

并且层次结构变得越来越大,并且随之而来的是来自 protobuff 消息的开销。我可以将这些消息扁平化为一条消息,但不确定它会变得多么易于管理。

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

最佳答案

可能值得考虑是否可以重新构造树以使用“压缩数组” - 例如,如果您发送 200 Transform (因此:600 Vector3 和 1800 int32),通过

repeated Transform data = 1;

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

repeated int32 data = 1 [packed = true];

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

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

这可以避免:

  • 1800 个整数字段标题
  • Transform 实例的 200 个字段 header
  • Transform 实例有 200 个长度前缀
  • Vector3 实例的 600 个字段 header
  • Vector3 实例有 600 个长度前缀

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

但是,它需要不同的处理。您必须手动将 9 个连续值的每个 block 视为变换。

关于protocol-buffers - 减少 protobuf 消息大小的最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51358560/

相关文章:

java - 使用 Protobuf 处理配置文件

c# - Protobuf-net 与 .proto 文件中的 oneof

c# - List 的 Protocol buffer 序列化

wcf - protobuf-net 是否支持 [DataMember(Order=0)]?

C++ Protobuf 错误 google::protobuf::internal::kEmptyString 错误

c++ - 程序状态和调试器不一致

java - 尝试写入 HDFS 时出现 InvalidProtocolBufferException

c# - 如何在使用 C# protobuf-net 生成的 c++ 中反序列化 "Serialized Protobuffer"

c# - 带有枚举的 Protobuf-net 反序列化异常

c# - protobuf-net 使用 DynamicType 序列化 System.Object 抛出异常