我使用 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 个字段 headerTransform
实例有 200 个长度前缀Vector3
实例的 600 个字段 headerVector3
实例有 600 个长度前缀
而不是仅使用单个字段 header 和单个长度前缀
但是,它需要不同的处理。您必须手动将 9 个连续值的每个 block 视为变换。
关于protocol-buffers - 减少 protobuf 消息大小的最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51358560/