0.前言
protobuf与帧同步没有必然联系,也不是说使用帧同步技术就一定要用protobuf,状态同步也可以使用。但是protobuf的特性和优点非常适合用在帧同步技术上,所以在这里简单介绍一下protobuf。
1.什么是protobuf
定义:可序列化的数据交换格式
用途:用通信协议传输数据,存储数据,是谷歌公司出的
详细的介绍可以阅读这篇文章
Kevin Yan:Protobuf语言指南zhuanlan.zhihu.com
2.为什么使用protobuf
其实阅读了上面的文章,可以大概知道protobuf的一些优势了
关于其特性我做了如下总结
- 与平台和语言无关(多语言支持)
- 高效(代码由编译器提前生成)
- 扩展性好(开源)
- 性能好(重点)
对比同类技术(json/xml)protobuf有一个缺点,数据的可读性比较差,因为同步的内容是二进制数据流。但是又由于帧同步的特性,只同步操作信息,所以我们又不需要阅读这些数据。
其实这里推荐使用protobuf的核心原因是高效。这里的高效分以下几个方面:
开发效率高,定义好消息体后,使用编译器自动生成双端代码。
传输效率高,使用特殊技术处理后,同步的数据字节更小。
其中帧同步技术是非常希望降低游戏延迟,提升游戏体验。protobuf较高的同步效率非常匹配帧同步的需求。
3.如何使用
可以参考以下文章
ProcessCA:游戏开发好帮手——Protobufzhuanlan.zhihu.com
4.总结
如果阅读了上面两篇文章 ,应该可以看出protobuf的核心技术是标记值。
message Student {
string name = 1;
int32 age = 2;
string sex = 3;
}
这里面的1、2、3都是标记值,不是赋值操作。
通过标记值可以确定字段的名字和类型,因为每个标志值的存在是唯一的,不可重复。
然后序列化成类似字典 key-value的形式进行传输,并且标记值只占1-2个字节。
在message编码成二进制消息体时字段编号1-15将会占用1个字节,16-2047将占用两个字节。所以在一些频繁使用的message中,应该总是先使用前面1-15字段编号。
整篇文章对于protobuf在帧同步中的应用没有做非常详细的介绍,之后有时间会逐渐丰富这块的内容,包括从零开始如何生成双端消息体到真正实现数据同步,暂时可以先参考一下上述两篇文章。