腾讯技术分享实录:游戏后台开发九问

30日,在上海chinajoy嘉里酒店进行了游戏开发者大会,腾讯游戏的研发部助力总经理聂志明进行了演讲。

他为大家演讲的题目是“游戏后台开发中的九个选择”,他解释,使用这个标题的原因,是因为我们在生活中总会遇到很多选择,这个道理同样适用在游戏开发中。原文请见:http://games.qq.com/a/20110730/000379.htm


第一,选择什么样的架构。

SNSGame是大世界的模式,通用大世界方案的系统必须平行发展。
MMO: 存在世界地图,位置很重要,有地形概念,每个玩家都有自己的物理坐标。交互频繁,逻辑复杂,交互的实时性要求高,严重依赖于预先设计的游戏内容。小世界有小世界的好处。
第一:易于就近部署及,减轻国内网络复杂与MMO对网络要求高的矛盾。
第二: 通过分区服务,降低了因为架构导致的运营问题的严重性,小世界的内部在架构上也需要有一定的可伸缩性,这取决于游戏的设计。

第二,选择单线程还是多线程。

单线程程序的执行只有一条主线,容易跟踪、调试和定位。
单线程加异步模式可以提供更好的性能,我们会选择单线程模式。
只在必须的时候才使用多线程,如果使用了多线程,尽量减少线程间的交互需求

第三,如何在游戏中使用脚本。
一种是C/C++的框架,主要逻辑用C/++编写,脚本用来做一些局部扩展。C/C++的框架,主要逻辑用脚本来编写,耗性能的地方用C/C++决定的。 使用脚本的原则,脚本是一种胶水语言,通常用来隔离变化,易变化的逻辑用脚本实现,快速响应。
偏重性能还是偏重开发速度 (看注重什么再选择)

第四,如何处理网络通讯。
一种是跟游戏服务器耦合带一起,游戏服务器既处理问落接入相关的逻辑,也处理游戏逻辑。
一种是把网络通信部分剥离住来,向游戏服务器提供一种以消息为单位的、非阻塞的、有Qos能力的中间服务,游戏服务器看不到网络的细节。
我们选择第二种好处,是基于这样的考虑,首先简化了游戏服务器的处理逻辑,降低了编程的难度。更易于提升后台整体的处理性能,不同部分可以独立的优化,因为它可以不断的优化和在不同项目里面去继承的。

第五,如何处理游戏通信协议。
协议分两大类:文本协议和二进制协议.
文本协议直观,版本兼容性好,但是效率低。
版本兼容性问题其实是我们在通信协议的时候,都需要重点考虑的。二进制协议效率高,但是不直观,版本兼容性处理相对复杂。
Web相关的游戏根据与浏览器交互的方式可能采用文本协议,基于效率原因,C/S类型的游戏通常采用二进制协议。
游戏服务器是时钟消息和网络消息驱动的,大部分代码都是接受消息,或者接纳,其实有很多的解码、编码、代码占了相当大的比例。我们可以把协议做一个区分,就变成一个消息的协议描述,然后生成工具,然后得到网络协议处理代码。
这是我们的做法,我们自己定义了一套协议描述方法,并实现了相应了工具集。我们这个协议重点会有所不同,在于高性能、与C/C++的无缝结合以及多协议版本共存能力。利用我们这个版本来描述协议,不断在上面添加新的内容,但是其实可以进入到所有的低版本的客户端协议,不需要开发者做任何处理,它会自动生成。类似的方式大家可以看Google protobuf orFacebook thrift。

第六,如何设计存储结构。

一种是把游戏的每一个数据对象的属性看成一个单独字段,遵循RDBMS的要求来设计数据库表和索引,尽量符合3NF。以MMO为例,有帐号表、角色基本信息表、物品表、装备表等等,这是一种方式。

还有一种方式更具体,角色的列表类数据尽量采用blob来存储而不是另一个表。原则是这些列表数据只被角色自身所拥有,就是这个玩家所拥有,其他玩家不会拥有个数据,它的生命周期跟玩家是一致的,不存在其他的交叉拥有情况,技能、物品、装备、任务、好友等等都属于这种情况。

存取交互简单,角色登录或者推出时通常只需要存取一到二条记录。同一个角色的数据易于保持一致,易于多版本数据共存。我们把这些数据存到数据库的时候,会把编码存到数据库里面。所以在数据库里面做完的数据可能会不一样,不过不会影响,它会共存。

这种方式也会有缺点,数据维护工具、客服工具实现相对复杂,需要提供特殊的API来操作数据。如果手上工具是通用的,可能比以前要直白一点。某些类型的统计相对要麻烦一些,有些常用的数据,比如说角色的等级,在这方面可以用一些方式解决你的问题。
就是Nosql数据库,性能高,存在好的开源实现,游戏的数据访问多为唯一键访问,很少复杂的Query,符合Nosql数据库的特点。

第七,如何设计网络同步。
遵循几个原则:第一网络条件好的玩家获得好的体验;第二网络条件差的玩家尽可能获得好一些的体验,但不能拖累其他玩家的体验;第三外挂不能在网络同步方面获得持续的好处。
首先要探测玩家的网络质量;第二在玩家机器与服务器之间进行时钟同步;第三基于游戏特点,设计合理的同步机制。像竞技类的游戏,都是根据它的某些特点决定的,这是需要我们权衡考虑的。这里强调一点,在外挂获得好处,跟玩家体验时间做一个折中,你要保证外挂持续得到源源不断的好处,这样外挂就会上去。对于探测、时钟同步都需要控制好。

第八,如何定义性能基准。
做游戏开发通常不太注重事先对于性能的规划,多以结果作为目标,基本上是看后来测试出来的性能,能优化则优化。性能基准包括客户端和服务器,客户端的性能基准与游戏的目标市场有关。 制约性能的因素,网络IO/磁盘IO/内存/CPU。
  • 网络IO,可以分析,取悦于由游戏类型、游戏设计所形成的业务模型,可估算。
  • 内存,相对来讲更简单,取决于用到的主要数据结构,相对来讲更聚焦,更能估算出来支撑多少人。
  • CPU计算能力,其实也不是计算,需要更多对CPU的支撑,简单的方式,这个游戏取决于游戏类型导致的逻辑复杂性。

第九,如何在不同项目间进行代码复用。
简单的把上一个项目的可用代码拷贝过来自行维护是最简单的方式,但是会导致同一个功能有N种实现变体,每个变体都解决一部分问题。把共用的代码收归一个组织来开发和维护,形成公共组件,能够解决上述的问题,但是又会带来新的问题。要解决这些问题,也很难有一些具体的方法,有几个原则,以服务、进程、库来提供。提供充分的工具,满足调试、验证、部署、运营等需求,如果推广好对你有很大的关系。
最后还有充分的提供扩展能力,可以降低组件开发的压力。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值