举一个例子 如果我们要发送一段 文本 例如123 那么 我们的就通过我们定义的通讯协议把123 发送给做事器,做事器吸收到之后 取出123 个中这个文本的定义被我们定义成数据交流协议。
在游戏开拓中常用的数据交流协议 有 :string ,JSON ,C++ 构造体, protobuffer ,flatbuffer,等等一系列 数据交流协议,当然你也可以自定义。
在这么多协议中如何选择呢。

文本
这个是很随意马虎想到一个协议,由于大略,不过缺陷也非常明显,没有约束,格式不明确,需自己写解析类。在那登录来说,如果我要发送用户名和密码,那么我们可能会这么写 用户名,密码这个做事器拿到数据之后根据逗号拆分出用户名和密码 来进行校验。如果这个时候我的通报的构造更繁芜呢?就会创造这个在开拓中就会产生巨大的沟通本钱。
JSON
JSON(JavaScript Object Notation, JS 工具简谱) 是一种轻量级的数据交流格式。它基于 ECMAScript (欧洲打算机协会制订的js规范)的一个子集,采取完备独立于编程措辞的文本格式来存储和表示数据。简洁和清晰的层次构造使得 JSON 成为空想的数据交流措辞。 易于人阅读和编写,同时也易于机器解析和天生,并有效地提升网络传输效率。
每种措辞的都有自己对应的解析类,看起来是一个不错的选择。还拿登录举例子{"userName":"用户名","pwd":"密码"} 看起来完美办理了文本传输带来的问题。但是实在问题还没有办理掉,问题1:我想传输 是是用户名和密码,但是实在增加了额外的传输 例如 我要传输userName 和pwd 这些描述。网络带宽额外的增加了。问题2 json 实在不能很好的表示数据类型,例如userName 到底是字符串还是number 类型。这也就导致了 须要额外的书写一份文档。
C++ 构造体
如果客户段和做事器的都是用C ++写的 那么这无疑是最好的选择,速率快,占用内存还少。但是一样平常情形下 我们只能哀求做事器是C++写的,客户端是无法逼迫哀求的,由于前端 例如unity 紧张是C#代码 作为开拓 cocoscreate 紧张用 js 作为代码,当然也有用的C++的例如虚幻,cocos2d-x 等等 ,每种引擎都有自己的试用场景,以是无法逼迫哀求客户端。如果选择别的措辞,对付解析构造体就会很麻烦,虽然也能做。但是我们有没有更好的办理方案呢
protobuffer
protobuffer是google开拓的一种数据描述措辞,它能够将构造化的数据序列化,并切可以将序列化的数据进行反序列化恢复原有的数据构造。一样平常用于数据存储以及通信协议方面。
Package example;message Person{ required string name = 1; required int32 id = 2; optional string email = 3; enum PhoneType{ mobile = 1; home = 2; work = 3; } message PhoneNumber{ required string number = 1; optional PhoneType type = 2; } repeated PhoneNumber phone = 4;}
上面的这个便是一个protobuffer 一个构造的定义,这个基本就办理JSON 的缺陷。他在网络传输的时候利用的是二进制传输,现在protobuffer 险些供应了市情上主流的措辞的支持。须要查看详细用法的可以去看官方文档,基本便是5分钟可以上手。
FlatBuffers
FlatBuffers为Google发布的一个跨平台,供应多种措辞接口,看重性能和资源利用的序列化类库。目前该类库供应C++, C#, C, Go, Java, JavaScript, PHP, and Python措辞接口。该序列化类库多用于移动端手游数据传输以及特定的对性能有较高哀求的运用。
namespace MyGame;attribute "priority";enum Color : byte { Red = 1, Green, Blue }union Any { Monster, Weapon, Pickup }struct Vec3 { x:float; y:float; z:float;}table Monster { pos:Vec3; mana:short = 150; hp:short = 100; name:string; friendly:bool = false (deprecated, priority: 1); inventory:[ubyte]; color:Color = Blue; test:Any;}root_type Monster;
上面是一个FlatBuffer 的定义,从构造来说 和proto 很想, 那么两者有什么差异的。最大的差异便是性能。其他并无太大差别。如果你看了详细的协议文档你会创造FlatBuffers 更适宜游戏,当然笔者的部分游戏便是采取的这个协议。
不过FlatBuffers和protobuffer最大问题便是调试未便利,由于传输的时候都是二进制,以是在调试不是很方便,不过他的优点足以粉饰他的确定,以上两种基本都供应完全的类库供大家利用,在利用过程中并不会觉得有什么问题。
至于以上协议大家想采取那些须要根据项目来选择,并不是说最好的一定是最得当的。须要根据项目的需求来决定。
以上便是我个人的一些总结,可能不是全面。如果有疑问,大家可以关注我,私信或者在评论区留言。