程序丨鹅厂公开课:谈数据表示在游戏开发中的应用
讲师简介:莫锡昌,腾讯互娱北极光工作室群高级工程师。2010年毕业加入腾讯,参与了《轩辕传奇》、《天涯明月刀》两款大型MMORPG游戏开发,现任一款MMORPG手游项目服务器负责人,同时带领团队进行游戏服务器引擎的研发工作。
什么是数据表示?
计算机经过这么多年的发展,无论在硬件、软件还是其他方面都已经演变得十分复杂。我们有非常多的编程语言,而这些语言的编码结构和数据描述是不尽相同的。由于其中的差异和隔阂,编程语言之间进行数据交换其实是一件很痛苦的事情。
除了编程语言之外,我们还有很多不同的硬件,同样一个字节,在英特尔的机器上是一种表示方法,到了ARM上又换了另外一套,二者直接交换数据的时候便会出现问题的。更头疼的还有编码。
我们如何在异构的系统之间,高效而且便捷地进行通信?
所有的这些问题,其实都可以通过加一个中间层来解决,这个中间层就是数据表示(Data Representation,简称DR)。DR可以有效地把通信一端的数据进行转换和表示,再发给另外一端,接收端通过DR收到拿到数据,然后进行decode和进一步理解。
当接触DR的时候,你需要学习它的IDL语言,学习它有哪些数据操作的接口,另外最重要的需要学会怎么样进行版本控制。
关于IDL-接口描述语言:
IDL(Interface Description Language)是用来描述软件组件接口的一种计算机语言,它是通过一种中立的方式来描述接口,使得在不同平台上运行的对象和用不同语言编写的程序可以相互通信交流。
关于Version Contorl-版本控制支持:
数据可以有不同版本,且版本间可按照一定规则兼容。
数据表示在游戏开发中的应用
1、游戏协议
游戏协议相比其他通用的协议要复杂很多,比如HTTP、FTP、SSH其实来回交互最多十条,但是游戏是高度定制化的,可能会有上千条的操作。以《天涯明月刀》端游为例,从2010年到现在,有四千条以上的协议,结构体有一万三千多个,如果没有DR的话,维护起来还是很难的。DR可以帮我们进行协议的管理,尤其是实现多重嵌套的结构体以及二进制数据的传输。
另外游戏协议往往变更频繁,《天涯明月刀》从2016年到2017年,平均每天要修改协议1.6次,在迭代开发的高峰的时候,协议会变更得更快。通过DR提供版本控制,可以方便进行协议兼容。
另外一个特点就是网络流量非常巨大,一台机器的流量接近600M,高峰时期可以达到1G,一组服务器有12台机器,那就是12G。《天涯明月刀》项目组大概有四十组服务器,整个宽带流量是异常巨大的,而如果流量太大则意味着更高的成本,并且对玩家的体验造成影响。这就需要通过DR提供的数据压缩功能,进行流量优化。
2、数据存储
游戏开发中数据存储也比较特别,它的数据结构复杂,每个玩家的存储涉及到成千上万个字段;同时数据结构不稳定,每次版本更新有可能会新增字段或扩大原有字段;另外它的数据量还很大,像《天涯明月刀》这种分区分服的游戏,单服就有100万以上的玩家数据。
对于游戏开发来说,我们会采用Key-Value数据存储模型,Key就是角色ID,Value是二进制角色数据,我们会把所有玩家的数据放到Value里面。MySQL里面有一个Blob的字段,就是用来放二进制数据的。但是一个二进制数据放进去之后,对数据库来说是透明的,但是我们代码需要去读取和存储这个数据,这就需要用DR来管理了。
本文为课程《游戏开发中的数据表示》内容节选
进入小程序可查看系列课程完整内容
↓↓↓