在游戏中会遇到很多问题,下面大体总结:
这九个选择分别是:
第一,选择什么样的架构。
第二,选择单线程还是多线程。
第三,如何在游戏中使用脚本。
第四,如何处理网络通讯。
第五,如何处理游戏通信协议。
第六,如何设计存储结构。
第七,如何设计网络同步。
第八,如何定义性能基准。
第九,如何在不同项目间进行代码复用。
先介绍一下在腾讯开发跟别的公司会有不同,在我内部遵从两个岗位,每个公司里面是按照不同模块来分。为什么会这样分?前台是通过便,后台讲究的是不便,我们不是追求新的技术,而是解决问题。
下面我开始演讲,这是北京最盛名的一座桥,每次都不知道怎么走,越来越复杂。我们每天都会遇到很多选择,所以导致人也不是很愉快。
我现在来讲九个选择,从Q1到Q9,后面一一按照这个顺序做个阐述。
第一,选择什么样的架构?其实是SNS特点决定的,不同的特点决定不同的架构。玩发围绕的是玩家之间偏真实的关系链,位置对玩家是不重要的,玩家之间没有物理上的距离概念,SNSGame是大世界的模式,通用大世界方案的系统必须平行发展。MMO的特点,前几年是一个发展重点,很多人了解也不是很多,它的特点是存在世界地图,位置很重要,有地形概念,每个玩家都有自己的物理坐标。交互频繁,逻辑复杂,交互的实时性要求高,严重依赖于预先设计的游戏内容。小世界有小世界的好处。第一易于就近部署及,减轻国内网络复杂与MMO对网络要求高的矛盾。大家知道网络有很多问题,大家知道问题也解决不了。对MMO来讲,是一个很高的类型,所以会用小世界。
通过分区服务,降低了因为架构导致的运营问题的严重性,小世界的内部在架构上也需要有一定的可伸缩性,这取决于游戏的设计。并不是所有的小世界只有一台服务器搞定,因为它的元素、它的特点对它也会有不同的要求。
在我选择这种架构的时候,我们会有原则,选择什么样的架构取决于游戏自身的设计,这取决于某些特点,并不是所有服务都有同样的需求,并不是大世界就好,小世界就不行。我们不从纯技术角度追求大世界的架构,大世界需要游戏内容的支持,通常美术策划无法支撑百万在线的世界,这是最根本的原因。大世界在架构上有困难,但这是部分不可克服的。
我讲大家非常熟悉的一个例子,通常最复杂的大区概念,大区通常是做帐号,服务器在服务器里面按角色区分。线,就是有的游戏有,有的游戏没有,在这些线里面只是为了扩展这个世界的流量上线,线目前来说只是一个方便,这是一个样对复杂的示意部署视图(PPT)。
我们看一个架构,如果展开来讲,左边是一些辅助服务,右边的Worldsvr像公会的那种会放在这个里面,加在服务器上面,不同的游戏会有不同的处理。这是一个简单的示意图,在不同的游戏里面会有不同的区分。
第二,选择单线程还是多线程?不同的公司会有不同的做法,这个问题并不是所有人都碰到,也有个概率,但是大家也会有争论。争论的原因,通常是双方关注的重点不同,单线程程序的执行只有一条主线,容易跟踪、调试和定位。我们腾讯也不是一定说要这样选择,我们理由非常理由,单线程加异步模式可以提供更好的性能,我们会选择单线程模式。现在我们游戏开发周期很长,在漫长的运行周期里面每周都会更新,交接过程中会有问题的,使用多线程容易导致问题。这个时候我们会进行一些处理,我们对里面的要求角度来看,运行的周期很长、节奏很快,为了达到要求我们可以想更简便的方式。
新形势,对我们也是有一些影响,现在有一些四核以上的CPU出现,这个时候我们会尝试把一些通用的服务,把相对固定的进程变成简单化,这是一个新趋势。
这是适应新趋势的原则,只在必须的时候才使用多线程,如果使用了多线程,尽量减少线程间的交互需求,这样我们就好把握。
第三,如何在游戏中使用脚本?在游戏开发中通常大家都会使用一些脚本。客户端对脚本的需求非常明显,这里主要讨论服务器端。两种使用脚本的方式:一种是C/C++的框架,主要逻辑用C/++编写,脚本用来做一些局部扩展。C/C++的框架,主要逻辑用脚本来编写,耗性能的地方用C/C++决定的。
使用脚本的原则,脚本是一种胶水语言,通常用来隔离变化,易变化的逻辑用脚本实现,快速响应。一般情况下是说这个性能高,那个性能低,上面两种方法没有对错之分,取决于两点,开发团队成员的能力,对不同语言的掌握程度;公司或者项目组的导向,偏重性能还是偏重开发速度,如果是创业型的团队,对性能方面要求多一些,怎么样把游戏做好才是最重要的。
第四,如何处理网络通讯?其实网络通信本身是非常复杂的事情,目前的开发环境已经提供了相对来讲简单得多的编程接口,但是网络程序还是需要处理很多的问题。
两种处理方式:一种是
Node.js的官网为:http://www.nodejs.org/
Bottle的官网为:http://www.nodejs.org/download/
二.安装说明
linux下的安装命令如下所示:
wget http://nodejs.org/dist/v0.10.5/node-v0.10.5.tar.gz
tar zxvf node-v0.10.5.tar.gz
cd node-v0.10.5.tar.gz
./configure --prefix=/home/zhaolincheung/local/nodejs
make && make intall
注:这里将node.js安装在/home/zhaolincheung/local/nodejs目录下。node.js的安装需要python2.6以上的支持,否则在执行./configure时会出错;node.js还需要gcc-c++的支持,所以系统需要实现安装gcc-c++。
通过 node -v来检查安装是否成功,如果返回:v.0.10.5,则说明安装成功。
至此node.js已经编译并安装完成。如需卸载,可以执行make uninstall进行卸载。
三.简单的hello world程序学习任何语言或者框架,首先要写的程序就是hello world程序。这里也是这样,我们来写一个简单的hello world程序。
首先,编写helloworld.js,内容如下:
varhttp = require('http'); http.createServer(function(req, res) { res.writeHead(200, {'Content-Type':'text/plain'}); res.end('Hello World\n'); }).listen(10001); console.log('Server running at http://127.0.0.1:10001/');其次,执行该文件:/home/zhaolincheung/local/nodejs/bin/node helloworld.js
最后,通过浏览器访问http://127.0.0.1:1337便得到了hello world的响应。
四.开发进阶 作者在网上看到了一个很好的node.js的入门资料,分享给大家,参考链接为:http://www.nodebeginner.org/index-zh-cn.html#passing-functions-around
代码链接:https://github.com/zhaolincheung/nodejs_demo