游戏服务器 – 数据表示

游戏服务器 – 数据表示

数据表示基础

在计算机世界中,无论从硬件、软件还是从各种各样的角度来说,非常复杂,现在有慢慢统一的趋势,但是,不可能完全统一。比如说我们有非常多的编程 语言C\C++\Java,这些语言无论是从编码结构,还是对数据的描述,都是不一样的。编程语言之间要进行数据交换,其实是很痛苦的,它们之间是存在一个隔阂。除了不同语言之外呢,还有不同的硬件,最直接的字节序肯定不一样,有大端有小端,同一个字节在因特尔机器上是这么表示,在arm是另一种表示,当他们直接交互数据的时候,就会出现问题。还有更头痛的就是编码,做web的同学深有体会。

各种各样的编程语言、硬件,限制了相互之间的通信。比如,一个Intel的上用c++写的程序,向SPARC上用java写的程序发了一个hello,直接用一个二进制体打包,这样肯定是不行的。

如何才能更加便捷有效的异构系统间进行通信

All problems is compoter science can be solved by another level of indirection. — David Wheeler

计算机中的所有问题,都可以通过加一个中间层来解决。当然,异构系统间进行通信也离不开这个烂俗的条件。我们加一个中间层来解决两个东西间的通信问题

DR ,可以有效的把通信一端的数据进行转换和表示,再发给另一端。另外一段可以通过DR拿到数据,然后DECODE出来,就能识别它.DR,其实就是一个中间的翻译者。

什么是数据表示(DR)

  • 数据表示,Data Respresentation
  • 什么是数据
    • Data are the facts or details from which information is derived
  • 如何表示数据
    • various forms for same information
    • for example 666
  • 数据表示的定义
    • DP is a group of methods that can describe , reveal , and operate on information

数据表示的要素

  • IDL – 接口描述语言
    • Interface Description Language
    • IDL是用来描述软件组件接口的一种计算机语言。IDL通过一种中立的方式来描述接口,使得在不同平台运行的对象和用不同语言编写的程序可以相互通信交流
  • Data Operation -数据操作支持
    • serialize 序列化,将一个数据打包成二进制发给另一端,先进行序列化。
    • deserialize 反序列化
    • visualize 可视化,进行调试的时候,要对数据进行可视化,这个二进制数据是表示对象的哪个属性是哪个值。
    • transform 转化,同样一个数据可以是内存态,也可以是持久态,也可以是别的形态。
    • compression 压缩,现在主流的DR实现,都实现了这个功能。编程运行时的高效靠前面4个操作完成,数据传输时的高效可以通过压缩完成
  • Version Control – 版本控制支持
    • 数据可以有不同版本,且版本间可按照一定规则兼容
    • 业界DR现状
    • DR对比

DR,不仅仅是会使用它,更重要的是它产生的原因是什么,它要解决的痛点是什么,它最底层的实现是什么样的。如果做每件事情,都能做到这种程度的话,我们会觉得你会是一个非常好的做工程或走学术的一个人才。学计算的一个大忌是,学了一些空洞的概念和语言,但是对细节一无所知。

数据表示在游戏开发中的应用

  • 游戏开发 – 协议 (以天刀为例)
    • 交互内容复杂
      • 多重嵌套结构体/二进制数据
    • 协议量巨大
      • 4000+ 条协议定义
      • 13000+结构体定义
    • 变更频繁
      • 平均每天1.6次修改
    • 网络流量巨大
      • 单机峰值流量超过600mbps
  • 游戏开发 – 协议管理
    • 通过IDL来描述协议
    • CS共享IDL源文件
    • 分模块、分层

  • 游戏开发 – 异构系统协议交互 *多类型终端协议交互 * server ,Linux/x86/c++ * client * PC/IPhone/Android * C++/C#/lua
    • DR的重要性,支持多终端通信。如,炉石传说支持pc/手机/pad上玩,支持很多不同类型设备之间的通信
  • 游戏开发 – 协议版本兼容
    • 通过DR提供的版本控制来进行协议兼容
    • 以Protobuf为例,optional 与 required 当服务器更新到1.1版本时,有的客户端还没升级到1.1,为了兼容旧的客户端版本,在之前协议体后面加一个optional类型的字段,这样就可以保证服务器也能处理旧的协议,这样就实现了整个异步升级的过程

  • 游戏开发 – 协议流量优化
    • 通过DR提供的数据压缩功能进行流量优化。压缩的原理都差不多,把不用的空间去掉
  • 游戏开发 – 数据存储特点
    • 数据结构复杂,每个玩家的存储设计到成千上万个字段
    • 数据机构不稳定,每次版本更新有可能会新增或扩大原有字段
  • 游戏开发 – 传统范式在游戏设计中是否还有意义?
    • 成千上万的字段,分表会很多且难以维护
    • 大量连表查询,效率低下
    • 数据结构变困难,对已经存在大量数据的表格里,进行ablter table时,耗时巨大
  • 游戏开发 – 数据存储设计
    • Key-Value数据存储模型
      • Key – 角色ID
      • Value – 二进制角色数据
      • MySQL Blob
    • 使用DR管理Blob数据
      • 数据序列化/反序列化
      • 数据兼容
      • 数据压缩

JackLei
JackLei

我是真的不会修电脑