Unity3D高级编程:主程手记
上QQ阅读APP看书,第一时间看更新

3.1.4 比特流数据

比特流数据是一种相对机器来说稍微直接点的数据表现形式。我们是将数据以byte的形式存放在文件里,程序通过读取二进制文件里的数据,按一定的规则将其转化为所需要的数据。相比文本形式的数据文件,比特流数据文件的特点是,占用的空间更小,解析速度更快,但其缺点也存在,通用性较差,数据格式改变比较困难,无法直观看到文件中的内容,也无法做到不依靠程序进行任意修改。

相比文本数据文件,比特流形式的数据文件为什么会更小呢?比特流在存储数字时会使用二进制格式存放数字和浮点数,而文本则使用字符串形式存放,比如.txt文本中的23345是“23345”这个字符串,占用了5个字符,每个字符2byte,就用了10byte,而比特流则在存储时直接使用2byte(short)存储“23345”这个数字,相比文本数据足足小了8byte,因此比特流形式的数据存储文件更小。一个以.txt格式建立的10MB的数据文件,转化为二进制格式后,只要几百KB甚至几十KB。

一个10MB的文件在读取的时候是很慢的,因为CPU要等待I/O设备从硬盘里读取数据再放入内存,假如项目中有几个甚至几十个这样的数据文件,在游戏进行中卡顿就很难避免。这么大的数据文件光读取整个内容就已经让I/O速度很慢了,更别说还需要在读取文本数据后进行解析。文本解析要让成千上万个字符串转化为数字或者浮点数,这会消耗比较多的CPU计算量。

比特流数据和数据网络传输时使用的协议是一个道理,有人使用了JSON格式的数据协议来传输网络数据,所以当数据大时,JSON字符串占用的数据量也非常大,启用压缩算法也不能解决根本问题。因此很多人转而使用比特流形式的数据协议来传输网络数据,以减少网络数据占用量,即使在网络不稳定的情况下,因为体量比较小,能够准确送达的概率仍大了很多,从而网络反应速度也提高了很多。关于网络协议的具体内容,会在后面的章节中介绍。

以比特流形式作为协议的标准很多,比如最近比较流行的Google Protobuf,以及MessagePack。

下面简单介绍Google Protobuf。

Protobuf是一个开源协议,它是由Google公司开发的,并且是现在市面上比较流行的数据协议。简单来说,它和XML差不多,也是把某种数据结构的信息以某种格式保存起来。但它是采用比特流形式存储数据的,并且有一定的通用性和扩展性,数据小而灵活,所以比较好用。它的用处很多,在游戏项目中主要用于数据存储、传输协议格式等场合。

Protobuf有什么特色呢?我们将这些数据协议内容放在网络层的章节里介绍。